|
ОС UNIX в основе своей наиболее полно отвечает требованиям
технологии «север – клиент». Для построения программных систем, работающих по
принципу модели «сервер – клиент» в ОС UNIX существуют специальные механизмы, описанные ниже.
Сигналы
ОС UNIX, предоставляющая каждому пользователю виртуальный компьютер,
поддерживает систему прерываний, отвечающую стандартным требованиям:
-
обработка исключительных ситуаций;
-
средства обработки внешних и внутренних прерываний;
-
средства управления системой прерываний.
Всем
этим требованиям в ОС UNIX отвечает техника сигналов, которая не только воспринимает и
обрабатывает сигналы, но может их порождать и посылать на другие машины
(процессы). Сигналы могут быть:
-
синхронными, когда сам процесс инициирует сигнал;
-
асинхронными, когда интерактивный пользователь за
терминалом инициирует возникновение сигнала. Источником асинхронных прерываний
может быть ядро, когда оно контролирует состояние аппаратуры.
Сигнал
– простейшая форма межпроцессого взаимодействия, которое используется для
передачи от одного процесса другому или ядра системы какому-либо процессу
уведомления о возникновении определенного события.
Семафоры
Семафор – переменная определенного
типа, которая доступна параллельным процессам для проведения над ней только
двух операций:
-
закрытия (P-операция);
-
открытия (V-операция).
Семафор
играет роль вспомогательного
критического ресурса, так как операции P и V неделимы при своем выполнении и взаимно исключают друг друга.
Семафорный
механизм работает по схеме, в которой сначала исследуется состояние
критического ресурса, а затем уже осуществляется допуск к критическому ресурсу
или отказ от него на некоторое время. При отказе доступа к критическому ресурсу
используется режим «пассивного ожидания», поэтому в состав механизма включаются
средства формирования и обслуживания очереди ожидающих процессов.
Основным
достоинством семафорных операций является отсутствие состояния «активного
ожидания», что может существенно повысить эффективность работы
мультипрограммной вычислительной системы.
Операция P(S) проверяет текущее значение семафора S, и если оно меньше нуля, то осуществляется переход к следующей
за примитивом операции, иначе процесс снимается на некоторое время с выполнения
и переводится в состояние «пассивного ожидания». В этом состоянии ожидающий
процесс не проверяет семафор непрерывно, поэтому на процессоре может
выполняться другой полезный процесс.
Операция
V(S) связана с увеличением значения семафора на единицу и переводом
одного или нескольких процессов в состояние готовности к выполнению.
Операции
P(S) и V(S) выполняются операционной системой в ответ на запрос, выданный
некоторым процессом и содержащий имя семафора в качестве параметра.
Механизм
семафоров, реализованный в ОС UNIX, является обобщением классического механизма семафоров
общего вида. Семафор в ОС UNIX состоит из следующих элементов:
-
значение семафора;
-
идентификатор процесса, который хронологически
последним работал с семафором;
-
число процессов, ожидающих увеличения значения
семафора;
-
число процессов, ожидающих нулевого значения семафора.
Для
работы с семафорами имеются следующие три системные вызова:
-
создание и получение доступа к набору семафоров;
-
манипулирование значениями семафоров (синхронизация
процессов на основе использования семафоров);
-
выполнение разнообразных управляющих операций над
набором семафоров.
Программные каналы
Программный канал (конвейер,
транспортер) является средством, с помощью которого можно производить обмен
данными между процессами. Принцип работы
конвейера основан на механизме ввода/вывода, который используется для работы с
файлами в ОС UNIX. Задача, передающая информацию, действует так, как будто она
записывает данные в файл, а задача, для которой эта информация предназначена,
читает ее из этого файла. Операции записи и чтения осуществляются не записями,
а потоком байтов. Программный канал представляет собой поток данных между двумя
(или более) процессами. Конвейеры не являются файлами на диске, а представляют
собой буферную область.
Программные
каналы (pipes) в ОС UNIX являются очень важным
средством взаимодействия и синхронизации процессов. Теоретически
программный канал позволяет взаимодействовать любому числу процессов,
обеспечивая дисциплину FIFO (first-in-first-out). Процесс, читающий из программного канала, прочитает самые
давние данные, записанные в программный канал. Традиционно для хранения данных
использовались файлы, в современных версиях
ОС UNIX применяются и другие средства, например, очереди сообщений.
В ОС UNIX различают два вида программных каналов:
-
именованный
программный канал может служить для общения и синхронизации произвольных
процессов, знающих имя данного программного канала и имеющих соответствующие
права доступа;
-
неименованным
программным каналом могут пользоваться только создавший его процесс и его
потомки.
Очереди
сообщений
Очереди сообщений (Queue) являются более сложным методом связи взаимодействующих
процессов по сравнению с программными каналами. С помощью очередей также можно
из одной или нескольких задач независимым образом посылать сообщения некоторой
задаче-приемнику. При этом только
процесс-приемник может читать и удалять сообщения из очереди, а
процессы-клиенты имеют право лишь помещать в очередь свои сообщения. Очередь
работает только в одном направлении, если необходима двухсторонняя связь,
следует создать две очереди.
Работа
с очередями сообщений имеет много отличий от работы с конвейерами:
-
очереди сообщений предоставляют возможность
использовать несколько дисциплин обработки сообщений:
o
FIFO
– сообщение, записанное первым, будет прочитано первым;
o
LIFO
– сообщение, записанное последним, будет прочитано первым;
o
приоритетная – сообщения читаются с учетом их
приоритетов;
o
произвольный доступ – можно читать любое
сообщение, а программный канал обеспечивает только дисциплину FIFO;
-
при чтении сообщения из очереди оно не удаляется, а
может быть прочитано несколько раз;
-
в очередях реально присутствуют не сами сообщения, а
только их адреса в памяти и размеры. Эта информация размещается системой в
сегменте памяти, доступном для всех задач, общающихся с помощью данной очереди.
Каждый
процесс, использующий очередь, должен предварительно получить разрешение на
использование общего сегмента памяти с помощью системных запросов, потому что
очередь – системный механизм и для работы с ней требуются системные ресурсы и
обращение к самой ОС.
Для
обеспечения возможности обмена сообщениями между процессами механизм очередей
сообщений поддерживается следующими системными вызовами:
-
образование новой очереди сообщений или получения
дескриптора существующей очереди;
-
посылка сообщения, т.е. постановка его в указанную
очередь сообщений;
-
прием сообщения, т.е. выборка сообщения из очереди
сообщений;
-
выполнение ряда управляющих действий.
Ядро
хранит сообщения в виде связанного списка (очереди), а дескриптор очереди
сообщений является индексом в массиве заголовков очередей сообщений.
Разделяемая память
Для работы с разделяемой памятью используются четыре
системных вызов:
-
создание нового сегмента разделяемой памяти или
нахождение существующего сегмента с тем же ключом;
-
подключение сегмента с указанным дескриптором к
виртуальной памяти обращающегося процесса;
-
отключение от виртуальной памяти ранее подключенного к
ней сегмента с указанным виртуальным адресом начала;
-
управление разнообразными параметрами, связанными с
существующим сегментом.
После подключения сегмента разделяемой памяти к
виртуальной памяти процесса этот процесс может обращаться к соответствующим элементам памяти с
использованием обычных машинных команд чтения и записи, не прибегая к
использованию дополнительных системных вызовов.
Вызовы
удаленных процедур (RPC)
Во многих случаях взаимодействие процессов имеет
характер «клиент – сервер». Один из процессов «клиент» запрашивает у другого
процесса сервера» некоторую услугу и не
продолжает свое выполнение, пока эта услуга не будет выполнена. По смыслу такой
режим взаимодействия эквивалентен вызову процедуры, поэтому он так и назван. По
идеологии ОС UNIX
идеально соответствует требованиям сетевой операционной системы, поэтому на ее
основе можно создавать распределенные системы и организовывать распределенное
вычисление. Одной из основных требований к RPC является автоматическое преобразование форматов данных при
взаимодействии процессов, выполняющихся на разнородных компьютерах.
Технология вызовов удаленных процедур (RPC – remote procedure call) должна обеспечить
работу взаимодействующих процессов, находящихся на разных компьютерах.
В случае удаленного вызова передача параметров
процедуре превращается в передачу запроса по сети.
Вызов удаленных процедур включает следующие шаги:
-
процесс «клиент» производит локальный вызов процедуры,
которую называют «заглушкой». Задачи «заглушки» следующие:
o
принять аргументы;
o
преобразовать аргументы в стандартную форму;
o
сформировать сетевой запрос. Упаковка аргументов
и создание сетевого запроса называется сборкой;
-
сетевой запрос пересылается на удаленную систему, где
соответствующий модуль ожидает такой запрос и при его получении извлекает
параметры вызова процедуры, а затем передает их серверу удаленной процедуры.
После выполнения осуществляется обратная передача.
|