Сетевые операционные системы

       

Права доступа


В первом приближении, для каждого процесса ядро поддерживает таблицу всех портов, к которым он имеет доступ. Эта таблица хранится в ядре, так что пользовательский процесс не может получить к ней доступ. Процесс ссылается на порты, указывая номер их позиции в этой таблице, например, 1, 2 и так далее. Входы этой таблицы содержат указатели на порты и определяют разрешенные над ними действия, и называются мандатами. Назовем таблицу списком прав доступа (списком мандатов).

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

Все нити одного процесса имеют равные права по доступу к портам процесса. Права определяются по отношению к трем возможным операциям: ПОЛУЧИТЬ, ПОСЛАТЬ и ПОСЛАТЬ-ОДИН-РАЗ. Право ПОЛУЧИТЬ дает возможность обладателю этого права прочитать сообщение из порта. Ранее упоминалось, что связи в Mach однонаправленные. Это означает, что в любой произвольный момент только один процесс может иметь право ПОЛУЧИТЬ для данного порта. Мандат с правом ПОЛУЧИТЬ можно передавать другому процессу, но это означает, что он будят изъят у исходного процесса. Таким образом, для каждого порта имеется только один потенциальный получатель.

Мандат с правом ПОСЛАТЬ позволяет его владельцу отсылать сообщения определенному порту. Таким правом могут обладать многие процессы. Эта ситуация является грубым аналогом банковской системы во многих странах: каждый, кто знает номер банковского счета, может положить на него деньги, но только владелец может снять деньги со счета.

Право ПОСЛАТЬ-ОДИН-РАЗ также позволяет отослать сообщение, но только однократно.
После того, как сообщение отослано, ядро отбирает это право. Этот механизм используется для протоколов типа запрос-ответ. Например, клиент хочет, чтобы сервер выполнил какой-то его запрос, поэтому он создает порт для получения ответа. Затем он отсылает сообщение-запрос серверу, содержащее защищенный мандат для порта ответа с правом ПОСЛАТЬ-ОДИН-РАЗ. После того, как сервер отошлет ответ, мандат отзывается из его списка прав доступа, и мандат с таким именем может быть только вновь внесен в список прав в будущем.

Имена прав доступа имеют действие только внутри процесса. Два процесса могут иметь доступ к одному и тому же порту, но использовать для этого разные имена. На рисунке 6.10 оба процесса имеют право посылать сообщения на порт Y, но для процесса А это мандат номер 3, а для процесса В - мандат 4.

Список прав доступа привязан к определенному процессу. Когда этот процесс завершается или уничтожается, его список удаляется. Порты, для которых он содержал право на операцию ПОЛУЧИТЬ, больше не могут использоваться, и они уничтожаются, даже если в них есть недоставленные сообщения.

Если различные нити процесса получают одни и те же права несколько раз, то в списке прав доступа делается только по одной записи. Для того, чтобы фиксировать данные о том, сколько раз присутствует каждое право, ядро использует счетчик ссылок для каждого порта. Когда права доступа удаляются, счетчик ссылок уменьшается. Право удаляется из списка, только когда он становится равным 0. Этот механизм важен, так как различные нити могут получать и отдавать права без уведомления друг друга.



Рис. 6.10. Списки прав доступа

Каждая запись в списке прав может представлять собой одно из четырех значений:

  • Право для порта.

  • Право для набора портов.

  • Нулевая (пустая) запись.

  • Код, показывающий, что порт, который был здесь записан, теперь не существует.

    Первая возможность уже детально пояснена. Вторая позволяет нити читать из набора портов, даже не зная о том, что имя права относится к набору портов, а не к отдельному порту.Пустая запись отмечает неиспользуемую строку списка.

    Наконец, четвертая возможность отмечает порты, которые уже не существуют, но для которых права ПОСЛАТЬ еще существуют. Например, когда порт удаляется из-за того, что процесс, имеющий право ПОЛУЧИТЬ для него, завершен, ядро отслеживает все права ПОСЛАТЬ и помечает их как несуществующие. Попытка послать сообщение с нулевым и несуществующим правом приводит к ошибке с соответствующим кодом. Когда все права ПОСЛАТЬ для порта отменены, неважно по каким причинам, ядро может (опционально) отослать сообщение, уведомляющее получателя, что не осталось ни одного отправителя, и можно не ожидать сообщений.


    Содержание раздела