Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 64
Текст из файла (страница 64)
11озже, при запросе сообщения, страницы становятся разделяемыми между отправителем н получателем, Карты хранения используются на стадии передачи, что гарантирует создание ядром системы новой копии страницы для отправителя, если он попытается внести в нее изменения до того, как страница будет запрошена получателем. В этом случае отправитель будет иметь доступ к ее оригинальной копии.
Описанное средство работает с максимальной производительностью, если ни отправитель, ни получатель нс вносят изменения в совместно используемые страницы. Так функционируют многие приложения. Внутренняя память копируется дважды: сначала от отправителя в ядро и затем из ядра получателю. Внешняя память копируется первый раз только тогда, когда одно из заданий попытается внести в нее изменения. 272 Глава б. Межпроцессное взаимодействие Карта адресов Отп ия КПД = Копи Страницы в памяти Карта адресов Отп епь Страницы в памяти Карта адресов Страницы в памяти в Рис.
6.12. Передача внешней памяти: а — сообщение копируется в карту хранения; б — сообщение копируется в задание-получатель; в — получатель производит изменения в странице Отправитель может указывать в дескрипторе типа флаг освобождения, В этом случае ядро не использует методику копирования при чтении. Оио просто копирует вхождения карты адресации в карту хранения во время вы- 6.7. Передача сообщений 273 полнения процедуры тз9 сору1по и удаляет их из карты адресации отправителя. При запросе сообщения функция тзо соруоШО производит копирование вхождений в карту адресации получателя и удаляет временную карту хранения.
В результате происходит перемещение страницы из адресного пространстна отправителя в пространство получателя без какого-либо копирования данных. 6.7.3. Управление нитью Передача сообщений происходит по двум возможным путям — медленному н быстрому. Медленный путь применяется в том случае, если получатель не ожидает сообщение в момент его отправления. В таком случае отправитель помещает сообщение в очередь и затем заканчивает свою часть работы. После того как получатель вызовет пзз9 гсч, ядро удалит сообщение из очереди н скопирует его в адресное пространство получателя.
Каждый порт обладает настраиваемым ограничением, называемым жирналом заказов (Ьаск1о8), в котором указывается максимальное количество сообщений, хранящихся в очереди. Если их число достигнет предельного значения, порт будет считаться заполненным, а все новые отправители будут блокированы до тех пор, пока из очереди не будет получено сколько-нибудь сообщений. Каждый раз, когда происходит запрос одного сообщения из порта, приостановившего работу отправителей, выполнение одного из них будет продолжено.
Следовательно, если из порта будут выбраны все сообщения, то будут разбужены все блокированные отправители. По быстрому пути передача происходит тогда, когда получатель уже ожидает поступления сообщения. В этом случае функция тзо зепд не будет помещать сообщение в очередь порта. Вместо этого она разбудит получателя н передаст ему сообщение напрямую. В системе МасЬ реализовало средство нод названием автоматического (Ьапг1-ой) планирования (8], при использовании которого одна нить может освобождать процессор непосредственно для другой определенной нити. Код быстрой отправки сообщений использует это средство для переключения на нить-получатель, которая завершает вызов и зо гсч, используя функцию тзо соруоит() для копирования сообщения в свое адресное пространство.
Такой подход предупреждает перегрузки, которые могут возникнуть при постановке сообщения в очередь и удалении нз нее. Это также ускоряет контекстное переключение, так как новая выполняемая нить выбирается непосредственно. 6.7.4. Уведомления Уведомления — это асинхронные сообщения, посылаемые ядром для инфоринрования задания об определенных событиях в системе. Эти сообщения от- 274 Глава 6.
(У)ежпроцессное взаимодействие Это сообщение посылается владельцу резервного порта, если его основной порт был удален (в случае существования резервного порта), Удаление портов и резервные порты будут обсуждаться в следующем разделе МОТ1ЕУ РОМТ ОЕ5ТМОУЕО Рассылается всем заданиям, обладающим правом отправки на порт при его удалении Уведомление может быть запрошено отправителем, если он посылает сообщение в заполненную полностью очередь (используя опцию 5ЕМО МОПРУ). Уведомление создается ядром после того, кзк сообщение удаляется из очереди мбт1РУ РОат Оесетев МОТ1РУ И56 АССЕРТЕО Последний тип уведомлений требует дополнительных уточнений.
Прк использовании опции 5ЕМО МОТ1ЕЧ сообщение будет передано даже в тои случае, если очередь будет заполнена полностькь Ядро возвращает статус 5ЕМО УЧ1СС МОТ1РЧ, который указывает отправителю на необходимость приостановить передачу дальнейших сообщений до того, как им будет получено уведомление МОПРУ М56 АССЕРТЕО. Такой подход позволяет отправителю передавать сообщения без блокировки. 6.8. Операции порта В этом разделе будут описаны некоторые операции, производимые над портамк, 6.8.1. Удаление порта Порт удаляется при освобождении прав на получение из него. Обычно это происходит при завершении работы задания, являющегося владельцем порта.
Если порт необходимо аннулировать, то непосредственно после этой операции все задания, обладающие правами на отправку в этот порт, получают уведомленит МОТ1РУ РОМТ ОЕСЕТЕО. При удалении порта удаляются и все сообщения, находя. щиеся в его очереди, будятся все заблокированные отправители и получатели, им отправляются уведомления 5ЕМО 1МЧАПО РОМТ и кСЧ 1МЧАС10 РОМТ соответственно. Операция удаления порта является сложной процедурой, так как сообще ния, находящиеся в его очереди, могут содержать права на другие порты. Если это права на получение, будут упразднены и порты, на которые они ссылают. ся. Фактически злоумышленник может отправить права на получение длю определенного порта через сообщение на каждый порт. Такое случается нечасто, но если это происходит, результатом может стать возникновение взаии.
ных блокировок и неограниченной рекурсии. К сожалению, в ОС Мас)1 15 эти проблемы так и не были решены. правляются в портя уведомления заданий. В МасЬ 1РС применяются три типа уведомлений: 6.6. Операции порта 275 6.8.2. Резервные порты Системный вызов рогТ зе1 оас1ир устанавливает резервный порт для указанного порта. Если порт, имеющий резерв, аннулируется, ядро системы не освобождает его, а передает все права на получение резервному порту. Этот процесс показан на рис. 6.13.
Порт П1 назначен в качестве резервного для порта П2. 11ри удалении П1 (возможно, что это произошло из-за завершения работы задания, владеющего им) ядро системы посылает сообщение МОПРУ РОЕТ РЕ5ТКОУЕО владельцу П1. При этом порт П1 не освобождается и становится владельцем прав на отправку в порт П2. Все сообщения, адресуемые П1, автоматически перенаправляются на П2, откуда они могут быть затребованы его владельцем. Рис. 6.13. Реализация резервных портов: а — назначение резервного порта, б — после удаления порта П1 6.8.3. Наборы портов Набор портов состоит из группы портов, чьи индивидуальные права на получение заменены единственным групповым правом получения (рис. 6.14). Таким образом, задание может получать сообщения из набора портов.
Ьолее того, оно может получать их выборочно от определенных портов набора. В противоположность описанной возможности, сообщения могут отправляться толь- 276 Глава 6. Межпроцессное взаимодействие ко на индивидуальные порты, а пе на их наборы. Задания могут обладать правами отправки на определенные порты набора. При получении сообщения в нем будет содержаться информация о том порте, с которого оно было послано. Бпогнрованн отправнтеп Рис. 6.14.
Набор портов Наборы портов удобны при обработке сервером сразу нескольких объектов. Серверы могут ассоциировать с каждым объектом отдельный порт, а затем объединить эти порты в набор. После этого сервер будет получать сообшения, отправленные на любой из портов набора. Каждое сообщение содержит в себе запрос, адресованный объекту, ассоциированному с портом. Так как в заголовке сообгцения имеется информация о порте-получателе, сервер знает, с каким из объектов необходимо произвести манипуляции. Возможности наборов портов сходны с вызовом системы 1ЛЧ1Х зе1ес1, позволяк>шим процессу проверить ввод на нескольких дескрипторах. Однако сушествует и важное отличие, заключаюшееся в том, что время, потраченное на запрос сообщегсия из набора портов или на отправку сообщения в порт из набора, не зависит огп общего количества портов в этом наборе.
Объект ядра порта содержит указатель на набор, к которому относится этот норт, а также указатели на двунаправленный связанный список всех портов набора. Если порт не входит в набор, значения этих указателей равны И1)1.Е Объект набора портов содержит единую очередь сообщений. Очереди входяших в набор портов не используются. Однако каждый порт продолжает поддерживать собственный счетчик и ограничение на количество сообшений, а также очередь блокированных отправителей, Когда нить отправляет сообшение в порт, являющийся членом набора, ядро проверяет, не превышен ли лимит порта (если это так, отправитель будет добавлен в очередь блокированных отправителей ггорта) и увеличивает количество сообгцений, находящихся в очереди. Затем ялро записывает имя порта в сообшение и переносит его в общую очередь набора портов.
При вызове получателем функции пгза гсч ядро запрашивает первое сообшение из очереди набора независимо от конкретного порта, которому оно было адресовано. 6.6. Операции порта 277 6.8.4. Передача прав Масп позволяет заданию произвести замену прав, относящихся к иному заданию, правами другого порта или получить право от другого задания. Такая возможность поручительства придала дополнительную гибкость управлению заданиями отладчиками и эмуляторами. На рис.
6.15 показан возможный сценарий взаимодействия между отладчиком и отслеживаемым им заданием (жертвой). Сначала отладчик переносит право отправки жертвы на свой порт 1ай веК при помощи вызова 1ай ех1вас1 вело и забирает его себе. Затем он вызывает 1ай 1пвегг вепд для передачи права отправки порту П1, владельцем которого является отладчик взамен права 1ай веК жертвы. Точно так же отладчик использует вызовы 1ай ехйас1 гесе1че и 1ай 1пвет1 гесе1че для передачи права на получение порта жертвы на свой порт 1ай веЫ и подстановки права получения на другой порт Пк, на который у отладчика имеются права отправки.
Жертва Отладчик Рис. 6.16. Переназначение портов отладчиком; а — задача-жертва перед передачей прав; о — после передачи прав порта После завершения этих действий ядро перехватывает все сообщения, отправляемые управляемым им заданием на порт 1ай поИу (то есть все системные вызовы МасЬ). Отладчик обрабатывает вызов и проверяет отправку ответа на порт ответа, указанного в исходном сообщении.