Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS.DOC
Скачиваний:
18
Добавлен:
28.10.2018
Размер:
653.82 Кб
Скачать
    1. Семафоры

Семафоры UNIX наряду с программными каналами, очередями сообщений и разделяемой памятью входят в так называемую группу IPC - средства межпроцессных коммуникаций (Interprocess Communication).

Семафоры - это достаточно мощное средство синхронизации процессов.

Зачем нужны семафоры?

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

Семафоры всегда являются средствами задержки процессов, которые тормозятся или "засыпают" на семафорах и "пробуждаются" и приходят в движение при изменении состояния семафоров. Таким образом, дескриптор семафора является информационной управляющей структурой ipc-perm и хранится в файле <sys/ipc.h>.

Процесс может создать семафор с помощью системного вызова semget.

В результате успешного выполнения semget возвращается semid - идентификатор созданного или уже имеющегося семафора.

После создания семафора любой процесс, который знает его идентификатор semid, может на него воздействовать с помощью системного вызова semctl, который осуществляет настройку и проверку состояния множественного семафора.

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

Процесс, выполняющий системный вызов semop, должен использовать поле sem_op в структуре sembuf, в котором задается требуемая операция:

struct sembuf {

ushort sem_num; /* номер элемента семафора */

short sem_op; /*конкретная операция над элементом семафора */

short sem_flg /* флаги */

Различают 3 типа операций:

1. sem_op > 0 - освобождение процессом, выполнившим semop, ресурса. контролируемого данным элементом семафора. Текущее значение элемента семафора semval увеличивается на величину sem_op.

2. sem_op = 0 - процесс, исполняющий такой вызов semop, будет переведен в ожидание до тех пор, пока не освободится ресурс, т.е. semval не станет равным нулю.

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

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

В этом случае необходимо использовать флаг SEM_UNDO.

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