Когда использовать Pipes и когда использовать Shared Memory - PullRequest
23 голосов
/ 14 марта 2012

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

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

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

Это единственное отличие применения разделяемой памяти и канала?

1 Ответ

47 голосов
/ 14 марта 2012

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

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

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

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

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

...