Опубликован: 06.12.2004 | Доступ: свободный | Студентов: 1179 / 142 | Оценка: 4.76 / 4.29 | Длительность: 20:58:00
ISBN: 978-5-9556-0021-5
Лекция 10:

Заключение

Передача и прием сообщений в реальном времени

Над описанными в настоящем курсе очередями сообщений определены следующие группы функций:

  • открытие очереди;
  • отправка сообщения в очередь;
  • прием (синхронный или асинхронный) сообщения из очереди;
  • изменение атрибутов очереди;
  • регистрация на получение уведомления о появлении сообщения в очереди;
  • закрытие очереди;
  • удаление очереди.

Для открытия очереди служит функция 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().