Разница между очередью сообщений и общей памятью?

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

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

Ответ 1

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

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

A очередь сообщений - односторонний канал: один процесс записывает в очередь, а другой считывает данные в том порядке, в котором он был записан, до тех пор, пока не произойдет условие конца данных. Когда очередь создается, задается размер сообщения (байты на сообщение, обычно довольно небольшие) и длина очереди (максимальное количество ожидающих сообщений). Доступ медленнее, чем общая память, поскольку каждая операция чтения/записи обычно представляет собой одно сообщение. Но очередь гарантирует, что каждая операция будет либо обрабатывать целое сообщение успешно, либо не работать без изменения очереди. Таким образом, писатель не может потерпеть неудачу после написания только частичного сообщения, и читатель либо получит полное сообщение, либо ничего вообще.

Ответ 2

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

Общая память может рассматриваться как более быстрая (низкая нагрузка, большой объем передачи данных), чем очереди. Но очереди, с другой стороны, требуют больших накладных расходов (настройка для создания очереди постоянной и т.д.) С небольшим объемом данных.

Бремя совместной памяти заключается в том, что вам необходимо реализовать синхронизацию, чтобы обеспечить безопасность потоков. Взгляните на отличную статью Бея об IPC.

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

В этом разница между двумя.

Ответ 3

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

Ответ 4

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