Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 61
Текст из файла (страница 61)
Многие современные системы ~ЗЫ1Х (в том числе и ЯгК4) предлагают системный вызов пипар, который назначает файл (или его часть) как адрес. ное пространство вызывающего процесса. Процессы могут применять вызоа пппар для осуществления взаимодействия между собой путем назначения одного и того же файла в адресном пространстве каждого процесса (в режиме МАР 5НАКЕО).
В результате этих действий появляется область разделяемой памяти, которой является содержимое файла. Если процесс изменяет назначенный файл, то произведенные им изменения становятся сразу видны остальным процессам, подключенным к этому файлу. Обновление файла на диске производится ядром системы. Преимушеством вызова пипар является исполь.
зование имен, принятых в файловой системе, вместо ключей. В отличие от 6,3. Яуз1епзЧ!РО 257 разделяемой памяти, чьи страницы резервируются в области свопинга (см. раздел 14.7.6), страницы, созданные шпзар, резервируются при помощи файла, к которому они были присоединены. Более подробно работа пипар будет показана в разделе 14.2. 6.3.5. Применение механизмов! РС Существуют определенные сходства между механизмами 1РС и файловой системой. Идентификатор ресурса похож на дескриптор файла. Вызов де1 повторяет ореп, команда 1РС йМ10 схожа с вызовом ип11пК а вызовы аепд и гесе1че аналогичны геаб и игг11е.
Системный вызов апшЖ предлагает возможности для разделяемой памяти, сходные с с1оае. Однако для очередей сообщений и семафоров не существует эквивалента вызова с1озе, так как представляется более предпочтительным удалять эти ресурсы сразу же. В результате процесс, использующий очередь сообщений или семафоры, может обнаружить, что необходимый ему ресурс больше не существует. Ключи, ассоциируемые с ресурсами и формирующие пространство их имен, значительно отличаются от имен, применяемых в файловых системах'. Каждый из этих механизмов обладает собственным адресным пространством, ключ используется для его однозначной идентификации. Так как ключ представляет собой простое целое число, выбираемое пользователем произвольно, он может быть использован только на одной машине и не подходит для распределенных сред вычислений. Также задача использования уникальных ключей независимыми между собой процессами представляет определенную трудность, поскольку простота ключей может привести к конфликтам при использовании их другими приложениями.
В системе 1)1ь)1Х поддерживается библиотечная процедура г1ок (описанная в руководстве зЫ1рс(СЗ)), которая применяется для создания ключей, основанных на именах файлов и целых числах. Синтаксис йок показан ниже: ~еу = тсоХ (сваг *расйпаюе, 1пс пох): Процедура тсок создает значение ключа на основе паях — номера индексного дескриптора файла. Намного проще решить задачу уникальности имени ключа при применении имен файлов (приложение, к примеру, может использовать в качестве такого имени путь к собственному выполняемому файлу) и тем самым уменьшить вероятность возникновения конфликтов. Параметр пйх увеличивает гибкость библиотечной процедуры и может быть использован для указания идентификатора проекта, известного всем взаимодействуюшим приложениям, или другой полезной информации, Основной проблемой механизмов 1РС является их незащищенность, так как идентификатор ресурса представляет собой ссылку на общую таблицу ' В некоторых ОС, таких как%~всемв МТ или ОВУ2, лля илгеи разлеляемых областей используются пути файловой системы (но ие в обязательном порялке, разлеляемые области могут быть и неименованными).
— Прим. ред. 258 Глава 6. Межпроцессное взаимодействие ресурсов. Доступ к ресурсу может получить процесс, не обладающий соответствующими полномочиями. Для этого нужно просто угадать идентификатор ресурса. Таким образом, процесс имеет потенциальную возможность считывать или записывать сообщения в разделяемую память или искажать семафоры других процессов. Назначение определенных полномочий ресурсу может частично решить проблему зашиты, однако часто процессам необходимо использовать ресурсы совместно с другими процессами, относящимися к разным пользователям системы.
Следовательно, в таких случаях невозможно применять строгие разграничения прав доступа. Использование последовательности чисел в качестве идентификатора ресурса дает очень ограниченную защищенность из-за того, что их не так уж трудно угадать.
Их применение ставит определенные проблемы перед приложениями, обладающими требованиями по безопасности. Большинство средств, представленных в Бузгещ Ъ' 1РС, может быть реализовано при помощи других возможностей системы, например блокировки или каналов. Однако инструменты 1РС являются более гибкими, эффективными и обладающими большей производительностью, чем компоненты файловой системы ОС. 6.4. Масй!РС Оставшаяся часть главы будет посвящена рассмотрению средств 1РС системы МасЬ, базирующихся на сообщениях. В МасЬ средства взаимодействия процессов являются центральным и наиболее важным компонентом ядра, Вместо реализации поддержки 1РС системой разработчики МасЬ создали средства 1РС, которые являются основой операционной системы.
При разработке МасЬ 1РС были поставлены следующие цели: + передача сообщений должна быть фундаментальным механизмом коммуникаций; + поддерживаемый объем данных одного сообщения должен варьироваться от нескольких байтов до размера всего адресного пространства системы (то есть до 4 Гбайт). Ядро должно осуществлять передачу больших объемов информации без копирования информации; + ядро обязано поддерживать защищенные соединения и позволять отправку и получение сообщений только авторизированным нитям; + средства коммуникаций и управления памятью должны быть тесно взаимосвязаны между собой.
Подсистема 1РС использует механизмы копирования при записи подсистемы памяти для повышения эффективности передачи больших объемов данных. С другой стороны, подсистема памяти прибегает к механизмам 1РС для осуществления коммуникаций с пользовательскими программами управления памятью; 6.4. Масп! РС 259 + средства МасЬ 1РС должны поддерживать коммуникации между пользовательскими заданиями, а также между пользователем и ядром. В системе МасЬ нить производит системный вызов при помощи отправки сообщения ядру, а ядро, в свою очередь, возвращает результат вызова в ответном сообщении; + механизм 1РС должен подходить для клиент-серверных приложений. В системе МасЬ для поддержки многих служб реализованы серверные программы пользовательского уровня (например, поддержка файловой системы или управление памятью), которые ранее обычно обрабатывались ядром операционной системы.
Такие серверные программы используют МасЬ 1РС для обработки запросов к службам; + интерфейс должен быть расширяемым до поддержки распределенных вычислений. Пользователь не должен знать, куда он отправляет сообщения: на локальный сервер или удаленный узел. Средства 1РС долгое время оставались неизменными в различных версиях системы МасЬ. Механизмы взаимодействия процессов МасЬ 2.5 будут представлены в разделах 6А — 6.9.
Эта версия системы является наиболее популярной, и именно ее взяли за основу разработчики ОЯГ/1 и Ия)са1 1)ЫХ. В МасЬ 3.0 возможности 1РС были расширены. О них пойдет речь в разделе 6.10. В этой главе вы снова увидите термины «задание» или «нить» системы Мас1ь Более подробно они описывались в разделе 3.7.1, Вкратце, задание является набором ресурсов, в том числе пространства адресов, в котором выполняется одна или несколько нитей. Нить — это динамическая сущность, имеющая независимые счетчик команд и стек (логическая управляющая последовательность) программы.
Традиционный процесс 1)Ы1Х эквивалентен заданию, содержащему одну нить. Все нити задания разделяют между собой его ресурсы, 6.4.1. Основные концепции Основными понятиями 1РС в системе МасЬ являются сообщения и порты. Сообц1ение — это набор данных определенного типа. Порт — это защищенная очередь сообщений. Любое сообщение можно отослать только в порт, но не зааанию или нити.
В ОС МасЬ каждому порту присваиваются прива на получение и права на отправку. Эти права поддерживаются задачами. Право на передачу разрешает задаче оправлять в порт сообщения. Право на получение позволяет получать сообщения, которые были посланы в порт. Правом на отправку сообщений в один и тот же порт могут обладать сразу несколько заданий, но только одно из них, называемое владельцем порта, имеет право на по- 260 Глава б. Межпроцессное взаимодействие лучение'. Таким образом, порты разрешают производить соединения типа «лтногие к одному», как это показано на рис.
6.5. Отправители Рис. 6.6. Осуществление коммуникаций через порты системы Масс Сообщение может быть простым или сложным. Простое сообщение включает в себя обычные данные, не интерпретируемые ядром. Сложное сообщение может содержать обычные данные, внешней памяти (данные, передаваемые при помощи метода «копирования при записи»), а также права на отправку и получение для различных портов. Ядро интерпретирует эту информацию и преобразует ее в форму, необходимую получателю.
Каждый порт имеет счетчик ссылок, отслежива1ощий количество его прав. Каждое такое право (также называемое совместимостью) представляет одно из имен порта. Имена представляют собой целые числа, диапазон имен является локальным для каждого задания. Следовательно, для одного и того же порта двумя заданиями могут применяться разные имена (рис. 6.6). Точно так же, одно и то же имя порта в разных заданиях может ссылаться на различные порты.
Задача А Задача 6 Рис. 6,6. Локальные имена портов Порты также используются для представления объектов ядра. Следовательно, каждый объект, такой как нить, задание или процессор, может быть ' В ранних версиях системы Масп разделялись понятия владельца и обладателя права иа получеиие. В версии 2.5 (и более поздних) права владельца заменены средством «постановления порта, которое будет описано в разделе 6.8.2. б.б.
Сообщения 261 представлен как порт. Права таких портов представляют собой ссылки на объекты и позволяют производить различные операции над объектами. Обслуживание прав таких портов закреплено за ядром. Каждый порт имеет очередь сообщений конечного размера. Размер очереди является простым механизмом управления нитями. Отправители блокируются при заполнении очереди, а получатели — при пустой очереди. Каждое задание или нить обладает набором портов, заданных по умолчанию. Например, каждое задание имеет право на отправку в порт 1ай зец, представляющий само задание (правами на получение из этого порта обладает ядро) и право на получение из порта 1азх поИу (отправлять сообщения в который может ядро).