Здавалка
Главная | Обратная связь

Реализация взаимного исключения с помощью семафоров.



Для реализации взаимного исключения, например, предотвращения возможности одновременного изменения двумя или более процессами общих данных, создается двоичный (с возможными значениями 0 и 1) семафор S. Начальное значение этого семафора - 1. Критические секции кода (секции, которые могут одновременно выполняться только одним процессом) обрамляются "скобками" Р (S) (в начале секции) и V (S) (в конце секции). Процесс, входящий в критическую секцию, выполняет операцию Р (S) и переводит семафор в 0. Если в критической секции уже находится другой процесс, то значение семафора уже 0, тогда второй процесс, желающий войти в критическую секцию, блокируется в своей Р-операции до тех пор, пока процесс, находящийся в критической секции в данный момент, не выйдет из нее, выполнив на выходе операцию V (S).

Синхронизация с помощью семафоров.

Для обеспечения синхронизации создается двоичный семафор S с начальным значением 0. Значение 0 означает, что событие, еще не наступило. Процесс, сигнализирующий о наступлении события, выполняет операцию V (S), устанавливающую семафор в 1. Процесс, ожидающий наступления события, выполняет операцию Р (S). Если к этому моменту событие уже произошло, ожидающий процесс продолжает выполняться, если же событие еще не произошло, процесс переводится в состояние ожидания до тех пор, пока сигнализирующий процесс не выполнит v (S).

 

В случае, если одного и того же события ожидают несколько процессов, процесс, успешно выполнивший операцию Р (S), должен вслед за ней выполнить V (S), чтобы продублировать сигнал о событии для следующего ожидающего процесса.

Использование семафора в качестве счетчика ресурсов

Если у нас имеется N единиц некоторого ресурса, то для контроля его распределения создается общий семафор S с начальным значением N. Выделение ресурса сопровождается операцией Р (S), освобождение - операцией v (S). Значение семафора, таким образом, отражает число свободных единиц ресурса. Если значение семафора 0, то есть, свободных единиц больше не остается, то очередной процесс, запрашивающий единицу ресурса будет переселен в ожидание в операции Р (S) до тех пор, пока какой- либо из использующих ресурс процессов не освободит единицу ресурса, выполнив при ЭТОМ V(S).

Системные вызовы Unix/Linux для работы с семафорами

В ОС Unix/Linux механизм семафоров обслуживается тремя системными вызовами:

semget, semctl, semop.

 
Системный вызов semget создает массив семафоров или возвращает идентификатор уже существующего массива семафоров. Этот идентификатор используется при дальнейших операциях с семафорами.

Semget

получение идентификатора массива семафоров

Синтаксис

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget ( key_t key, int nsems, int semflg )

Описание

semget возвращает идентификатор массива из nsem семафоров, связанного с ключом, значение которого задано аргументом key. Если массива семафоров, связанного с таким ключом, нет и в параметре semflg имеется значение IPC_CREATE или значение ключа задано IPC_PRIVATE, создается новый массив семафоров. Значение ключа IPC_PRIVATE гарантирует уникальность идентификации нового массива семафоров.

Значение параметра semflg формируется как логическое ИЛИ одного из значений: IPC_CREATE (создать новый массив семафоров) или IPC EXCL (получить идентификатор существующего массива) и9 бит прав доступа (см. chmod).







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.