Когда использовать Pipes и когда использовать Shared Memory

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

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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам