Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / СПО2.doc
Скачиваний:
114
Добавлен:
11.02.2014
Размер:
527.87 Кб
Скачать

2.Синхронизация посредством операции«проверка и установка»

TS

Вводится переменная common - общая для всех процессов.

Common=1, если какой-либо из процессов находится в своем CS. С каждым процессом связана переменная local1, local2, принимающая значение common при операции TS

и common установившееся в 1 (BTS) в Ассемблере.

Var common, local2, local1: integer;

begin

common:=0

begin

PR1: while true do

begin

local1:=1;

while local1=1 do TS ( local1, common)

CS1;

common:=0;

PR1;

end

and

PR2: while true do

begin

local2:=1;

while local2=1 do TS (local2, common)

CS2;

common:=0;

PR2;

end

end

end.

Пусть должен войти в CS PR1. При этом local1=1.

После TS (local1, common), local1=0, при этом common=1.

PR1 перейдет в CS. После выполнения CS1 common=0, что даст возможность PR2 войти в CS2.

3.Семафоры

Термин «семафор» введен Даркстройем.

Семафор – переменная специального типа, которая доступна параллельным процессам для проверки над ней только 2-х операций:

- «закрытия» P;

- «открытия» V;

Семафор выполняет роль критического ресурса.

Схема работы семафора:

Сначала исследуется состояние критического ресурса, идентифицируемое значение семафора, а затем осуществляется доступ к критическому ресурсу или отказ от него на время.

При отказе доступа к критическому ресурсу исполняется режим «пассивного ожидания» и является примитивами относительно семафора.

Смысл P(S) заключен в проверке текущего значения семафора, и если S<0 , то осуществляется переход к следующей за примитивом операции. В противоположном случае процесс находится в состоянии «пассивного ожидании».

V(S) связана с увеличением значения семафора на единицу перевода одного или нескольких процессов в состоянии готовности к центральному процессору.

initSem - инициализация семафора

initSem (имя семафора, начальное значение семафора)

var S: semafor;

begin initsem (S,1);

begin

PR1: while true do

begin P(S);

CS1

V(S)

end

and

PR2: while true do

begin P(S);

CS2

V(S)

end

end

end.

Семафор S имеет начальное значение равное P. Если PR1 и PR2 попытаются одновременно выполнить P(S), то это удастся успешно сделать только одному из них. Пусть это сделал PR2, тогда он закрывает семафор S, после чего выполняется CS2. PR1 в рассмотренном состоянии будет заблокирован на семафоре S. После выполняется V(S) процессором PR2семафор открывается, указывая на возможность захвата каким-либо процесса освободившегося критического ресурса. При этом производится перевод PR1 из заблокированного состояния в состояние готовности.

Мьютиксы – простейшие двоичные семафоры, которые могут находиться в одном из двух состояний – отличном или неотличном (открытом или закрытом).

Когда какая-либо задача, принадлежащая какому-либо процессу, становится объекта mutex, то mutex переводится в неотличное состояние. Если задача освобождает мьютекс, то его состояние становится отличным.

Createmutex - создать

Openmutex - открыть

WaitForSingleObject - ожидание

Releasemutex - освобождение

Соседние файлы в папке лекции