Подтвердить что ты не робот

Каковы недостатки очередей сообщений Linux?

Я работаю над очередью сообщений, используемой для связи между процессом на встроенной Linux. Мне интересно, почему я не использую очереди сообщений, предоставляемые Linux, следующим образом:

msgctl, msgget msgrcv, msgsnd.

вместо создания разделяемой памяти и синхронизации с семафором?

В чем заключается недостаток использования этого набора функций непосредственно в бизнес-встроенном продукте?

4b9b3361

Ответ 1

Функции msgctl(), msgget(), msgrcv() и msgsnd() являются сообщением "System V IPC" функции очереди. Они будут работать на вас, но они довольно тяжелые. Они стандартизированы POSIX.

POSIX также предоставляет более современный набор функций, mq_close(), mq_getattr(), mq_notify(), mq_open(), mq_receive(), mq_send(), mq_setattr() и mq_unlink(), что может быть лучше для вас (такое смущение богатства).

Однако вам нужно будет проверить, какой из них, если он установлен, установлен на ваших целевых платформах по умолчанию. В частности, во встроенной системе может потребоваться их настройка или даже их установка, поскольку по умолчанию их нет (и то же самое можно сказать о разделяемой памяти и семафорах).

Основное преимущество любого из наборов сообщений состоит в том, что они предварительно отлажены (возможно) и, следовательно, уже имеют проблемы с параллелизмом - в то время как если вы собираетесь сделать это для себя с общей памятью и семафорами, у вас есть много работы, чтобы достичь того же уровня функциональности.

Итак, (пере) использовать, когда вы можете. Если это вариант, используйте одну из двух систем очереди сообщений, а не изобретайте свою собственную. Если вы обнаружите, что существует узкое место в производительности или что-то подобное, вы можете заняться написанием собственных альтернатив, но до тех пор &— повторно!

Ответ 2

Очереди сообщений системы V (те, которые управляются системными вызовами msg *) имеют много странных причуд и ошибок. Для нового кода я настоятельно рекомендую использовать сокеты домена UNIX.

При этом я также настоятельно рекомендую передавать IPC по протоколам общей памяти. Совместная память намного легче ошибиться и имеет тенденцию идти не так уж катастрофически.

Ответ 3

Передача сообщений отлично подходит для небольших блоков данных и где необходимо сохранить неизменность, поскольку очереди сообщений копируют данные.

Область общей памяти не копирует данные при отправке/приеме и может быть более эффективной для больших наборов данных при компромиссе менее чистой модели программирования.

Ответ 4

Недостатки очередей сообщений являются незначительными - некоторые системные вызовы и накладные расходы на копирование, которые не имеют большого значения для большинства приложений. Преимущества намного перевешивают эти накладные расходы. Синхронизация выполняется автоматически, и их можно использовать различными способами: блокирование, неблокирование, а так как в linux типы очереди сообщений реализованы как файловые дескрипторы, они могут даже использоваться в select() вызовах мультиплексирования. В разновидности POSIX, которую вы должны использовать, если у вас нет реальной необходимости использовать очереди SYSV, вы даже можете автоматически генерировать потоки или сигналы для обработки элементов очереди. И лучше всего они полностью отлажены.

Ответ 5

Очередь сообщений и общая память различны. И это зависит от программиста и его требования выбрать, что использовать. В общей памяти вы должны быть осторожны при чтении и письме. И процессы должны быть синхронизированы. Таким образом, порядок выполнения очень важен в общей памяти. В общей памяти невозможно определить, является ли значение чтения новым значением или более старым. И нет явного механизма ожидания.

Очередь сообщений и общая память различны. И это зависит от программиста и его требования выбрать, что использовать. Существуют предопределенные функции, облегчающие вашу жизнь в очереди сообщений.