Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Answers.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.55 Mб
Скачать

Семафоры

Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам.

Семафоры лучше всего представлять себе как счетчики, управляющие доступом к общим ресурсам. Чаще всего они используются как блокирующий механизм, не позволяющий одному процессу захватить ресурс, пока этим ресурсом пользуется другой. Семафоры часто подаются как наиболее трудные для восприятия из всех трех видов IPC-объектов.

Слово «семафор» в действительности является старым железнодорожным термином. Семафор в положении ON (руки подняты вверх) если ресурс свободен и в положении OFF (руки опущены) если ресурс недоступен (должны ждать).

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

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

Машенька послала запрос на печать. Менеджер смотрит на семафоры и находит первый из них со значением 1. Перед тем, как Машенькин запрос попадет на физическое устройство, менеджер печати уменьшит соответствующий семафор на 1. Теперь значение семафора есть 0. В мире семафоров System V нуль означает стопроцентную занятость ресурса на семафоре. В нашем примере на принтере не будет ничего печататься, пока значение семафора не изменится.

Когда Машенька напечатала все свои плакаты, менеджер печати увеличивает семафор на 1. Теперь его значение вновь равно 1 и принтер может принимать задания снова.

При управлении семафором(при запросе ресурсов) процесс устанавливает флаг операции:

Если флаг отрицателен, то его значение вычитается из семафора (семафор уменьшается - перев.). Это соответствует получению ресурсов, которые контролирует семафор. Если режим «без ожидания» не установлен, то вызывающий процесс засыпает, пока семафор не выдаст требуемое количество ресурсов (пока другой процесс не освободит их).

Если флаг положителен, то его значение добавляется к семафору. Это соответствует возвращению ресурсов множеству семафоров приложения. Ресурсы всегда нужно возвращать множеству семафоров, если они больше не используются!

Наконец, если флаг равен нулю, то вызывающий процесс будет усыплен (sleep()), пока значение семафора не станет нулем. Это соответствует ожиданию того, что ресурсы будут использованы на 100%. Хорошим примером был бы демон, запущенный с суперпользовательскими правами, динамически регулирующий размеры множества семафоров, если оно достигло стопроцентного использования.

Сообщения

Очереди сообщений являются средством обмена информацией между процессами, так же как и программные каналы. Однако, в отличие от каналов, они допускают более гибкую организацию взаимодействия процессов. При использовании очередей совсем необязательно существование парных процессов: «писателя» и «читателя». Просто существует некоторая очередь сообщений, которая используется как хранилище сообщений для любых процессов, которые к ней обращаются - и «читатели» и «писатели». Очереди имеют свои преимущества по сравнению с программными каналами. Например, чтобы осуществить дуплексную связь между двумя процессами, нужно создать два канала для каждого процесса: один для записи, а другой для чтения. В случае использования очередей можно обойтись одной очередью, если различать сообщения по типу: от клиента к серверу и наоборот. Кроме того, имеется возможность извлекать сообщения из очереди не только по принципу FIFO, но и в произвольном порядке. Эта особенность открывает возможность построения системы с приоритетным обслуживанием. Длина сообщений в очереди выбирается пользователем и может быть произвольной в пределах памяти, отведенной для размещения очереди в момент ее создания. В сообщении допустимы любые данные. Каждая очередь сообщений имеет свой уникальный идентификатор. Процессы могут записывать и считывать сообщения из разных очередей. Процесс, пославший сообщение в очередь, может не ожидать чтения этого сообщения другим процессом. Оно может быть прочитано другим процессом позже. Каждый процесс имеет следующие атрибуты: • тип сообщения; • длина сообщения в байтах; • данные сообщения. Для работы с очередями используются следующие системные вызовы: Msgge - создание очереди; Msgctl - установка параметров очереди; Msgsnd - посылка сообщения в очередь; Msgrcv - получение сообщений из очереди. Типичный пример использования очередей при организации работы сервера по обмену данными с несколькими клиентами. Поскольку очередь является объектом межпроцессного взаимодействия, к которому могут обращаться и процессы-«читатели» и процессы-«писатели», то сообщения (запросы), направляемые от любого из клиентов, устанавливаются в очередь с признаком типа «от клиента к серверу = 1». Кроме того, в таком сообщении устанавливается идентификатор клиента PID. Сервер, в свою очередь, может передать сообщение конкретному клиенту, зная идентификатор клиента. Сервер будет принимать сообщения с типом 1, а клиенты – сообщения с типами, равными идентификаторам.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]