Разница между механизмом IPC с общей памятью и вызовом API / системного вызова - PullRequest
1 голос
/ 13 апреля 2011

Я изучаю операционные системы (Silberscatz, Galvin et al).Мой опыт программирования ограничен случайным кодированием задач упражнений, приведенных в тексте программирования или тексте алгоритма.Другими словами, у меня нет должного опыта программирования приложений или системного программирования.Я думаю, что мой нижеприведенный вопрос является результатом недостатка опыта вышеизложенного и, следовательно, отсутствия контекста.

Я специально изучаю механизмы МПК.Читая об общей памяти (SM), я не мог представить сценарий реальной жизни, где процессы взаимодействуют с использованием SM.Загружена проверка процессов, подключенных к одному и тому же сегменту SM на моем компьютере с Linux (Ubuntu) (с использованием 'ipcs' в небольшом скрипте оболочки) здесь

Кажется, что большая часть общего доступа приложениямибыть с Х Дэймон.Из того, что я знаю, X является процессом, ответственным за предоставление мне моего GUI.Я сделал вывод, что эти приложения (в основном апплеты, которые остаются на моей панели задач) обмениваются данными с X о том, что необходимо изменить в их внешнем виде и отображаемых значениях.Является ли это разумным выводом ??

Если так, мой вопрос: в чем разница между моими приложениями, взаимодействующими с «X» через сегменты разделяемой памяти, и моими приложениями, вызывающими определенные API, предоставленные «X», и связанными с«Х» о необходимости обновить свои выступления ?? Разница Я имею в виду, почему не используется более поздний подход?

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

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

РЕДАКТИРОВАТЬ Я уточнил вопрос.Я отформатировал отредактированную часть, чтобы она была выделена жирным шрифтом

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Во-первых, поскольку X-сервер - это просто еще один процесс пространства пользователя, он не может использовать механизм системных вызовов операционной системы. Даже когда связь осуществляется через API, если она происходит между процессами пространства пользователя, за этим API будет какой-то механизм межпроцессного взаимодействия (IPC). Какой может быть общая память, сокеты или другие.

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

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

1 голос
/ 13 апреля 2011

Разница в том, что с API вы, как разработчик, можете не иметь доступа к тому, что происходит внутри этих функций, поэтому память не обязательно будет разделяться.

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

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

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

...