Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации лекций по ТОИ / 18-Проблема взаимного исключения.pps
Скачиваний:
46
Добавлен:
02.06.2015
Размер:
1.72 Mб
Скачать

Современные методы решения проблемы взаимного исключения

1.Блокирующие функции, Транзакция – это последовательность операции блокирования. операций, которая либо выполняется от

2.

Семафоры различных

начала до конца, либо (при

невозможности завершить все операции

 

типов.

 

последовательности) выполняется

 

Транзакции.

3.

откат (roll back) на начало этой

 

 

транзакции.

 

 

Таким образом, вся последовательность

 

 

выполняется как одна неделимая

 

 

операция:

 

 

begin transaction

 

 

Последовательность

 

 

операций

71

 

end transaction

 

 

Понятие семафора

Семафор – это защищённая переменная, значение которой можно

опрашивать и менять только при помощи специальных операций P и V (семафорных примитивов) и операции инициализации.

Семафоры могут находиться в двух состояниях:

закрыт и открыт.

Состояния определяются значениями:

Двоичные (бинарные) семафоры могут принимать только значения 0 (закрыт) или 1 (открыт).

Считающие семафоры (семафоры со счётчиками) могут принимать целые значения. Считающий семафор открыт, если значение счётчика больше 0, и закрыт в противном случае.

72

Семафорные примитивы

Операции P и V – это семафорные примитивы (неделимые операции), во время выполнения которых процессом к

переменной-семафору нет доступа для других процессов.

Примитив P – процедура, сбрасывающая в 0 или уменьшающая

значение семафора на 1, если семафор открыт; эта процедура заключает в себе потенциальное ожидание вызывающих

процессов в том случае, если соответствующий семафор закрыт к моменту выполнения этой процедуры процессом.

Процедура V отрывает семафор или увеличивает значение

счётчика на 1. Таким образом, вызов этой процедуры может активизировать некоторый процесс, ожидающий открытия

семафора.

73

Семафорные примитивы

SБинарный семафор

P(S)

if S = 0

 

then Hold(S)

 

else S := 0

V(S)

if not Empty(S)

 

then Release (S)

 

else S := 1 ;

Считающий семафор с неотрицательными значениями счётчика

if S = 0

then Hold(S) else S := S – 1

if not Empty(S) then Release (S) else S := S + 1 ;

Общий

считающий

семафор

S := S – 1; if S < 0

then Hold(S)

S := S + 1 ; if S<= 0

then Release (S)

Процедура Hold – задержка на семафоре (перевод процесса в состояние ожидания).

Функция Empty – функция проверки очереди процессов, ожидающих на 74 семафоре.Процедура Release – освобождение (активация) первого процесса в очереди.

Семафорные примитивы

SБинарный семафор

P(S)

if S = 0 then

 

hold(S);

 

S := 0

V(S)

S := 1 ;

 

release (S)

Считающий семафор с неотрицательными значениями счётчика

if S = 0 then hold(S);

S := S – 1

S := S + 1 ; release (S)

 

Будет ли этот вариант «примитивов»

 

верным?

 

Чем он отличается от описанного

75

выше?

 

Общий

считающий

семафор

S := S – 1; if S < 0 then

hold(S)

S := S + 1 ; release (S)

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

Процедура

инициализации

procedure INIT; binary semaphore B ; begin

B := 1 ; {Открыт} start(P1) ;

start(P2) end INIT .

Первый процесс

Второй процесс

process P1;

process P2;

binary semaphore B ;

binary semaphore B ;

begin

begin

while true do

while true do

begin

begin

BEFORE1 ;

BEFORE2 ;

P(B) ; {вход в КС}

P(B) ; {вход в КС}

CS1 ;

CS2 ;

V(B) ; {выход из КС}

V(B) ; {выход из КС}

AFTER1 ;

AFTER2 ;

end

end

end P1 .

end P2 .

76

Реализация отношения предшествования с помощью семафоров

Отношение предшествования реализуется, если есть функциональная зависимость между процессами.

Первая задача: задача «писателя и читателя» (единичная запись).

Процедура

инициализации

procedure INIT; binary semaphore B ; begin

B := 0 ; {Закрыт: }

{ запрет читателю

}

{ на чтение и

}

{обработку данных }

{ до их подготовки

}

{ писателем

}

 

start(P1) ;

 

start(P2)

77

end INIT .

 

Первый процесс

Второй процесс

 

(писатель)

(читатель)

 

process P1;

process P2;

 

binary semaphore B ;

binary semaphore B ;

 

begin

begin

 

...

...

 

BEFORE; {подготовка и запись}

P(B) ; {Ожидание от P1

}

{подготовленных данных}

{разрешения на выполнение}

V(B); {Разрешение для P2 }

AFTER ; {чтение и обработка}

{выполнить AFTER }

{прочитанных данных}

...

...

 

end P1 .

end P .

 

 

2

 

Реализация отношения предшествования с помощью семафоров

Вторая задача: задача «писателя и читателя» при работе с циклическим буфером

Процедура

инициализации

procedure INIT; binary semaphore B ;

integer semaphore E, F; begin

B := 1 ; {Буфер открыт} E := N ; {Все записи}

{в буфере пусты} F := 0 ; {В буфере нет}

{ни одной записи} start(P1) ;

start(P2) end INIT .

78

Первый процесс

(писатель) process P1;

binary semaphore B ; integer semaphore E, F; begin

while true do begin

...

produce_next_record ;

P(E) ;

P(B) ; write_record_to_buffer ;

V(B);

V(F);

...

end end P1 .

Второй процесс

(читатель) process P2;

binary semaphore B ; integer semaphore E, F; begin

while true do begin

...

P(F) ;

P(B) ; read_record_from_buffer;

V(B);

V(E); process_new_record ;

...

end end P2 .

Реализация отношения предшествования с помощью семафоров

Вторая задача: задача «писателя и читателя» при работе с циклическим буфером

Процедура

 

Первый процесс

 

Второй процесс

инициализации

 

(писатель)

 

(читатель)

procedure INIT;

 

process P1;

process P2;

binary semaphore B

;

binary semaphore B ;

binary semaphore B ;

integer semaphore E, F;

integer semaphore E, F;

integer semaphore E, F;

begin

 

 

 

do

B := 1 ; {Буфер

Будет ли это решение эффективным?

E := N ; {Все

 

{в буфере

Как его можно усовершенствовать?

 

F := 0 ; {В буфере

 

 

 

 

{ни одной

 

 

 

 

start(P1) ;

 

 

write_record_to_buffer ;

V(B);

record_from_buffer;

start(P2)

 

 

end INIT .

 

V(B);

V(E);

 

 

 

 

V(F);

process_new_record ;

 

 

 

...

...

 

 

 

 

end

end

 

79

 

 

end P1 .

end P2 .

 

 

 

 

 

Объекты диспетчеризации и синхронизация процессов

Объекты диспетчеризации – это объекты, влияющие на распределение времени процессора. Основной объект диспетчеризации – поток (thread object): время процессора в современных системах выделяется не программе (процессу) в целом, а отдельным задачам (потокам), которые в нём выполняются параллельно. Первичный поток порождается

автоматически. В системах имеется несколько типов объектов, реализующих семафоры: mutex object, event object, semaphore object, mutant

object. На каждом из этих объектов можно организовать ожидание.

Для организации ожидания (входа в критическую секцию, получения доступа к ресурсам…) используются функции

WaitForSingleObject и WaitForMultipleObject,

С помощью их параметров можно задать режим ожидания, ограничить его время. Результат, возвращаемый функциями, позволяет проверить, было ли ожидание «успешным» или завершилось по timeout. Это позволяет

80 предотвратить «смертельную блокировку», обработать ситуацию.

Соседние файлы в папке Презентации лекций по ТОИ