Когда использовать Pipes vs Когда использовать общую память

Я читаю о различных механизмах МПК. Я пытаюсь выяснить сценарии, где мы используем общую память, и где мы используем именованные каналы (FIFO).

Трубы: Многократный процесс может записывать, однако только один процесс может читать. Операция записи атомарна.

Общая память: Несколько процессов могут читать и писать. А также пользователю необходимо обеспечить взаимное исключение для чтения и записи.

Является ли это единственной разницей применения общей памяти и канала?

Ответы

Ответ 1

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

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

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

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

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