Заключение
Передача и прием сообщений в реальном времени
Над описанными в настоящем курсе очередями сообщений определены следующие группы функций:
- открытие очереди;
- отправка сообщения в очередь;
- прием (синхронный или асинхронный) сообщения из очереди;
- изменение атрибутов очереди;
- регистрация на получение уведомления о появлении сообщения в очереди;
- закрытие очереди;
- удаление очереди.
Для открытия очереди служит функция mq_open(). Одну очередь могут открыть несколько посылающих и/или принимающих сообщения процессов. При открытии может производиться контроль прав доступа.
Отправка осуществляется функциями mq_send() и mq_timedsend().
Для извлечения сообщений из очереди служат функции mq_receive() и mq_timedreceive(). На порядок приема влияет имеющийся механизм приоритетов сообщений.
Для опроса и/или установки атрибутов очереди служат функции mq_getattr() и mq_setattr(). Для каждой очереди задается фиксированная верхняя граница размера сообщений, которые могут быть в эту очередь отправлены.
Посредством функции mq_notify() процесс может зарегистрироваться на получение уведомления о том, что в очередь, бывшую до этого пустой, поступило сообщение.
После того, как процесс завершил работу с очередью сообщений, соответствующий дескриптор следует закрыть, воспользовавшись функцией mq_close().
Очередь сообщений можно удалить с помощью функции mq_unlink().
Семафоры реального времени
Семафор реального времени – это эффективный механизм синхронизации процессов, который представляет собой общесистемный разделяемый ресурс, имеющий неотрицательное целочисленное значение.
Основными операциями над семафором являются захват и освобождение. Если делается попытка захвата семафора, когда его значение равно нулю, выполнение вызывающего потока управления приостанавливается и он добавляется к множеству потоков, ждущих на семафоре.
Если при освобождении семафора множество ждущих потоков было непусто, один из них удаляется из этого множества и его выполнение возобновляется; в противном случае значение семафора просто увеличивается.
Семафоры бывают именованными и безымянными. Первые именуются цепочками символов и создаются функцией sem_open() с флагом O_CREAT, вторые создаются функцией sem_init().
Именованный семафор можно закрыть, обратившись к функции sem_close(), и удалить с помощью функции sem_unlink() ; для ликвидации неименованных семафоров служит функция sem_destroy().
Для захвата семафоров служат функции sem_wait(), sem_trywait() и sem_timedwait().
Освобождение семафора осуществляется функцией sem_post().
Функция sem_getvalue() позволяет опросить значение семафора, не меняя его состояния.
Необходимо отметить, что описание семафоров реального времени в стандарте POSIX-2001 внутренне противоречиво. В большинстве мест явно написано, что семафоры эти целочисленные; в то же время, из описания функции sem_wait() следует, что имеются в виду бинарные семафоры. Вероятно, ошибочно это последнее описание.
Объекты в памяти
Механизм объектов в памяти служит цели минимизации времени и унификации доступа. Стандартом POSIX-2001 предусмотрено три вида таких объектов:
Рассматриваемый класс средств базируется на идее отображения объекта в адресное пространство процесса, после чего доступ к объекту можно осуществлять обычными операциями чтения/записи. Если один объект отображен в адресное пространство нескольких процессов, он превращается в средство межпроцессного взаимодействия.
Отображаться могут обычные файлы, а также объекты в разделяемой и типизированной памяти.
Отображение объектов в адресное пространство процессов осуществляется функцией mmap().
Стандарт POSIX-2001 предусматривает возможность динамической смены разрешенных видов доступа к отображенным страницам посредством вызова функции mprotect().
Для отмены отображений в адресное пространство процессов служит функция munmap().
При работе с объектами в памяти полезны функции truncate() и ftruncate(), позволяющие установить размер объекта равным заданной величине.
Еще одна возможность, полезная в связи с отображением объектов в адресное пространство процессов, – синхронизация (согласование состояния) оперативной и долговременной памяти. Эту возможность реализует функция msync().
Стандартизованный программный интерфейс к объектам в разделяемой памяти включает функции shm_open() для открытия (возможно, с созданием) подобного объекта и получения его дескриптора, а также shm_unlink() для удаления ранее созданного объекта.
Объекты в типизированной памяти – это конфигурируемые реализацией именованные пулы памяти, доступные одному или нескольким процессорам системы через один или несколько портов.
Каждая допустимая комбинация пула памяти и порта идентифицируется именем, определяемым при конфигурировании системы способом, зависящим от реализации. Используя это имя, объект в типизированной памяти можно открыть при помощи функции posix_typed_mem_open(), а затем отобразить в адресное пространство процесса.
После того, как объект в типизированной памяти открыт, посредством функции posix_typed_mem_get_info() можно выяснить максимальный объем памяти, доступной для резервирования.
Функция posix_mem_offset() позволяет выяснить адрес (смещение от начала), длину и дескриптор объекта (блока) в типизированной памяти, отображенного в адресное пространство процесса.
Средства удержания процессов в памяти
Для повышения детерминированности поведения приложений реального времени в стандарт POSIX введены средства удержания в физической памяти страниц из адресного пространства процессов.
Для удержания в физической памяти группы страниц из адресного пространства процесса служит функция mlock().
Удержание отменяется после вызовов fork() и exec(), а также в результате ликвидации по какой-либо причине соответствующей части адресного пространства процесса. Явная отмена удержания группы страниц реализуется функцией munlock().
Если нужно удерживать в памяти все адресное пространство процесса (что имеет место для большинства приложений реального времени), целесообразно воспользоваться функциями mlockall() и munlockall().