Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 63
Текст из файла (страница 63)
Задание-владелец права; + 1оса1 паве (локальное имя). Имя права задания; + 1уре (тип). Отправка или получение; + об) (объект). Указатель на объект порта в ядре системы. Кроме этого, каждое вхождение преобразования находится в каждом из нижеперечисленных двунаправленных связанных списков: + ТР спа)п.
Цепочка хэширования, основанная на кортеже <1ай, рост>; + Т1 спа1п. Цепочка хэширования, основанная на кортеже ~ай, (оса( пашен; + тай сЬа|п. Список всех преобразований, владельцем которых является задание; + об) спа1п. Список всех преобразований порта. 6.7. Передача сообщений При передаче сообщения производятся следу|ошие действия: 1. Сначала отправитель создает сообщение в своем адресном пространстве. 2. Для его отправки отправитель вызывает системную функцию гвзд зепб.
Порт назначения указывается в заголовке сообщения. 3. Ядро копирует сообщение во внутреннюю структуру данных (1егп пазд 1) при помощи процедуры шзд сору1п(). На этой стадии происходит преобразование прав порта в указатели на объекты порта ядра и копирование внешней памяти в карту хранения.
4. В дальнейшем действия могут отличаться в зависимости от условий: если нить ожидает сообщение (находится в списке блокированных в ожидании приема из порта), она будет разбужена и сообщение будет передано ей напрямую; в ином случае, если очередь сообщений окажется заполненной полностью, отправитель будет заблокирован до тех пор, пока из очереди не будет удалено сообщение; ' Согласно рисунку не . 6», а»ан — Прим, ред. 268 Глава б.
Межпроцессное взаимодействие в ином случае сообщение будет поставлено в очередь порта, где оно будет находиться до тех пор, пока нить принимающего задания не загрузит птзд гсу. 5. Выход ядра из выполнения гпзд зепг) происходит после того, как сообщение будет поставлено в очередь или передано получателю напрямую. 6, Когда получатель вызывает системную функцию птзд гсч, ядро загружает процедуру п)зд бедцеие() для удаления сообщения из очереди, Если очередь окажется пустой, получатель будет заблокирован до тех пор, пока в ней не появится сообщение.
7. Затем ядро производит копирование сообщения в адресное пространство получателя при помощи функции гпзд соруоц((), которая производит дальнейшие преобразования внешней памяти и прав портов. 8, Во многих случаях отправитель сообщения требует ответа на него. Для того чтобы обратная передача была возможна, получатель должен обладать правами отправки в порт, владельцем которого является отправитель.
Отправитель передает это право в поле лоргпа ответа заголовка сообщения. При этом отправитель может воспользоваться вызовом гпасЬ грс для оптимизации обмена. Вызов тасЬ грс эквивалентен вызову п~зд зепг), за которым следует пгзд гси Получатапь Задание Отправитель Задание Скопированные данные Внутренние данные Скопированные данные Права порта (нмя) Указатель на объект порта Права порта (нмя) )егп азц Г Исходящая, (Сообщения ' ', Сообщения сообщение ,' '., в ядре) ,' ' получаталя Рис. В.В. Две стадии передачи сообщений На рис.
6.9 показаны изменения различных компонентов сообщения, происходягцие в процессе его передачи. Давайте рассмотрим некоторые аспекты передачи сообщения более подробно. 6.7. Передача сообщений 269 6.7.1. Передача прав порта Существует несколько причин осуществления передачи прав портов через сообщения.
Наиболее частым случаем является передача прав на порт ответа (рис. 6 10). Нить задания Н1 отправляет сообщение в порт П2, владельцем которого является задание Н2. В этом сообщении Н1 передает право на отправку для порта П1, для которого у нити Н1 имеется право на получение. В результате нить Н2 может отправить на порт П1 ответное сообщение, которое будет ожидать нить-отправитель. Описанная ситуация возникает настолько часто, что разработчики внесли в заголовок сообщения отдельное поле для хранения прав на порт ответа. ча Рис. 6.10. Сообщение может содержать права отправки на порт ответа Еще одной часто встречаюгцейся ситуацией является взаимодействие между серверной программой, клиентом и сервером имен (рис. 6.11).
Сервер имен хранит права отправки для некоторых серверных программ системы. Обычно серверные программы регистрируются в сервере имен самостоятельно сразу после начала работы (1). Все задания наследуют права отправки на сервер имен во время процедуры их создания (значение порта хранится в поле порта инициализации структуры задания). Рис. 6.11.
Использование сервера имен для инициализации взаимодействия между клиентом и сервером Если клиенту необходим доступ к серверной программе, он должен сначала получить право отправки в порт, владельцем которого является сервер. Для этого клиент делает запрос к серверу имен (1), который в ответ возвра- 270 Глава б. Межпроцессное взаимодействие тит право на отправку сообщений в его порт (3).
Этим правом клиент воспользуется для передачи запроса серверу (4). Запрос содержит порт получения, который может быть использован сервером для отправки своего ответа клиенту (5). Все последующие взаимодействия между клиентами и серверами не требуют проведения повторных запросов к серверу имен. Отправитель передает права порта, используя для него локальное имя.
Дескриптор типа для этого компонента сообщения информирует ядро о том, что данное поле является правами порта. Локальное имя ничего не говорит получателю сообщения, следовательно, ядро системы должно перед отправкой преобразовать его. Для этого оно производит поиск вхождений преобразований в 1азк, (оса! паве>, идентифицируя объект ядра (или глобальное имя) для этого порта.
При запросе сообщения ядру необходимо преобразовать глобальное имя в локальное имя, принятое в задании-получателе. Для этого ядро сначала проверяет, не имеет ли получатель прав на этот порт (хэшируя при этом тай, рой ). Если это так, ядро преобразует его в указанное имя. В противоположном случае ядро выберет новое имя порта получателя и создаст вхождение преобразования, указывающее на этот порт. Имена портов обычно представляют собой целые небольшие числа, поэтому ядро будет при выборе имени использовать наименьшее целое свободное число.
Так как ядро системы создает для этого порта дополнительную ссылку, ему необходимо также и инкрементировать счетчик объектов порта. Ядро производит эту операцию при копировании сообшения в системное адресное пространство, так как новая ссылка создается именно в этот момент, Отправитель также может указать в лескрипторе типа флаг освобождения. Тогда ядро системы освободит право на порт в задании-отправителе и не будет увеличивать счетчик ссылок на этот порт. 6.7.2.
Внешняя память Сообщение может содержать небольшой объем данных. В этом случае оно может быть передано путем физического копирования информации, сначала в буфер ядра, а затем (при запросе сообщения) — в адресное пространство задания-получателя. Однако такой подход является непрактичным при передаче больших объемов данных. Система Масп позволяет передавать в одном сообщении содержание всего адресного пространства (то есть до 4 Гбайт информации в 32-разрядных системах), поэтому необходимо средство, позволяющее вести передачу таких значительных объемов информации более эффективно.
Обычно при передаче данных большого объема большинство из них не изменяется ни отправителем, ни их получателем. В таких случаях нет нужды создавать отдельные копии данных. Страница памяти может дублироваться 6.7. Передача сообщений 271 только в том случае, если одно или оба задания попытаются внести в нее изменения. До этого момента оба задания будут разделять между собой одну и ту же физическую копию страницы. В системе Масп это реализовано при помощи метода «копирования при записи» подсистемы виртуальной памяти. В главе 15 управление памятью в ОС МасЬ будет описано более подробно. В этом разделе мы расскажем только об аспектах управления, относящихся к средствам 1РС. На рис.
6.12 показана передача внешней памяти (оцт-о(-11пе). Отправитель указывает на использование этого типа памяти при помощи флага в дескрипторе типа. Процедура гпзд сору(п(), вызываемая из тзд зепб, изменяет карты памяти отправителя, делая передаваемые страницы доступными только для чтения и копируемыми при записи. Затем для этих страниц создается временная карта хранения в ядре, и они также получают атрибуты «только для чтения» и «копирования при записи» (рис.
6.12, а). Если получатель вызывает тзд гсч, то функция тзд соруоо1() получает диапазон адресов в его пространстве и копирует туда вхождения из карты хранения страниц. Она также маркирует эти новые вхождения как доступные только в режиме чтения и копируемые при записи.
Затем происходит освобождение временной карты хранения (рис. 6.12, б). С этого момента отправитель и получатель используют страницы совместно в режиме копирования при записи. Если какое-либо из этих заданий попытается изменить страницу с таким атрибутом, результатом будет возникновение ошибки.
Обработчик этой ошибки распознает установки и решает проблему при помощи создания копии страницы и изменения карты адресации задания на эту копию. Обработчик также изменяет атрибуты, разрешая отправителю и получателю создавать собственные копии страницы (рис. 6.12, в). Следует запомнить, что передача внешней памяти минует две стадии. На первой стадии сообщение помещается в очередь, а страницы находятся в стадии пересылки.