Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metoduniINN3.doc
Скачиваний:
18
Добавлен:
08.02.2015
Размер:
294.4 Кб
Скачать

4. Обмен сообщениями с помощью разделяемой памяти и семафоров

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

Семафор 0

Семафор 1

0

1

Сервер ожидает передачи данных клиентом

1

0

Сообщение клиента готово для прочтения сервером

1

1

Данные ответа сервера клиенту готовы

Взаимодействие клиенты/сервер осуществляется следующим образом:

  1. Сервер создает набор семафоров и разделяемую область памяти. Он инициирует созданный набор значениями 0, 1.

  2. Сервер ждет, когда клиент передаст запрос в разделяемую область памяти. Для этого он выполняет системный вызов semop с заданными значениями -1, 0. Такой вызов блокирует сервер, потому что текущее значение набора 0, 1 и ни один из семафоров набора не может быть изменен системным вызовом semop со значениями -1, 0.

  3. Когда один или несколько клиентов пытаются передать данные в разделяемую область памяти, они выполняют системный вызов semop с заданными значениями 0, -1. Один из этих системных вызовов завершится успешно, потому что на тот момент значение семафоров 0, 1. Клиентский процесс, успешно выполнивший системный вызов semop, сразу же изменит значение семафоров на 0, 0. В результате будут блокированы все остальные клиентские процессы, которые выполняют системный вызов semop со значением 0, -1, а также сервер, выполняющий системный вызов semop со значением -1, 0.

  4. Клиентский процесс, изменивший значения набора семафоров, может теперь записать в разделяемую область памяти команду запроса на обслуживание и свой идентификатор. После этого он выполняет системный вызов semop со значениями 1, 0. В результате серверный процесс разблокируется и может вызвать системный вызов semop, но новые значения семафоров будут по-прежнему блокировать остальные клиентские процессы, которые выполняют системный вызов semop со значениями 0, -1. Если команда запроса на обслуживание не QUIT_CMD, этот клиентский процесс выполнит semop со значениями -1, -1 и заблокируется.

  5. Разблокированный сервер прочитает из разделяемой области памяти запрос на обслуживание, записанный клиентом. Если была записана команда QUIT_CMD, сервер освободит разделяемую область памяти и набор семафоров, а затем завершит свою работу. Если записанная команда другая, сервер запишет данные ответа в разделяемую область памяти, а затем выполнит системный вызов semop со значением 1, 1. Это разблокирует клиентский процесс, который выполняет системный вызов semop со значениями -1, -1. Остальные клиентские процессы, которые выполняют semop со значениями 0, -1, остаются заблокированными новыми значениями семафоров. После вызова semop сервер возвращается в состояние ожидания запроса на обслуживание от нового клиента.

  6. Клиент, который разблокирован сервером, устанавливает значения набора семафоров в 0, 0 и читает данные ответа сервера. Он обрабатывает данные (например, выводит на стандартное устройство вывода), а затем устанавливает значения семафоров в 0, 1, после чего завершается. Последний системный вызов semop возвращает систему в состояние, в котором один из клиентов будет разблокирован и начнет взаимодействовать с сервером через разделяемую область памяти и набор семафоров.

Это взаимодействие можно отобразить на следующей диаграмме:

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