Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС / 4. ОС - Управление процессами - 1

.pdf
Скачиваний:
64
Добавлен:
01.06.2015
Размер:
1.1 Mб
Скачать

31

Корректное выполнение критических секций

Процесс, который первым достигает своей критической секции, входит в нее.

Второй процесс не может войти в свою критическую секцию, пока первый процесс не выйдет из своей.

Безразлично, какой из процессов будет первым.

Операционные системы. Управление процессами - 1

32

Примеры ситуации взаимного исключения

Два процесса одновременно редактируют одну и ту же запись базы данных.

Результат редактирования непредсказуем.

Один процесс добавляет сообщение в очередь, а другой пытается взять сообщение из очереди для обработки.

Он может прочесть не полностью сформированное сообщение.

Два процесса одновременно пытаются обратиться к диску или к принтеру.

Результат выполнения операции непредсказуем.

Операционные системы. Управление процессами - 1

33

Требования к реализации критических секций

1.Два процесса не должны одновременно находиться в своих критических секциях.

2.Если процесс находится вне критической секции, он не должен мешать другим процессам войти в критическую секцию.

3.Недопустимо, чтобы процесс вечно ждал попадания в критическую секцию.

4.Все процессы равноправны.

Операционные системы. Управление процессами - 1

34

Решение с использованием булевского флага «Секция свободна»

Free := True;

Процесс A:

Процесс B:

. . . . .

. . . . .

while not Free do

while not Free do

;

;

Free := False;

Free := False;

{Критическая

{Критическая

секция A}

секция B}

Free := True;

Free := True;

. . . . .

. . . . .

Некорректность решения: остается момент уязвимости в местах, отмеченных красной линией.

При переключении процессов в эти моменты оба процесса могут войти в свои критические секции.

Операционные системы. Управление процессами - 1

35

Решение с чередованием процессов

Turn := A;

Процесс A:

Процесс B:

. . . . .

. . . . .

while Turn <> A do

while Turn <> B do

;

;

{Критическая

{Критическая

секция A}

секция B}

Turn := B;

Turn := A;

. . . . .

. . . . .

Некорректность решения: процессы входят в свои КС строго по очереди. Если процесс A готов второй раз подряд войти в свою КС, он вынужден ждать, пока B войдет в свою КС и потом выйдет из нее.

Операционные системы. Управление процессами - 1

36

Решение Питерсона

Turn := A;

FlagA := False;

FlagB := False;

Процесс A:

Процесс B:

. . . . .

. . . . .

FlagA := True;

FlagB := True;

Turn := B;

Turn := B;

while FlagB and Turn = B do

while FlagA and Turn = A do

;

;

{Критическая

{Критическая

секция A}

секция B}

FlagA := False;

FlagB := False;

. . . . .

. . . . .

Решение корректно.

Недостатки:

используется активное ожидание;

трудно обобщить на случай более двух процессов.

Операционные системы. Управление процессами - 1

37

Определение двоичного семафора

Двоичный семафор (mutex, мьютекс) – это переменная (S), которая:

принимает значения 1 (свободен) и 0 (занят);

допускает выполнение только двух неделимых операций:

P(S): текущий процесс ожидает, пока семафор S окажется свободным, и затем немедленно занимает S.

V(S): текущий процесс освобождает ранее занятый им семафор S.

никакие другие операции с семафором (проверки, присваивания и т.п.) не допускаются.

Неделимость операции P(S) означает, что между тем моментом, когда S оказался свободным, и тем, когда ожидавший процесс занимает S, невозможно вмешательство каких-либо других процессов.

Операционные системы. Управление процессами - 1

38

Реализация семафорных примитивов: вариант с активным ожиданием

P(S):

запретить прерывания;

 

while (S = 0) do begin

 

Здесь переключение

разрешить прерывания;

процессов допустимо

запретить прерывания;

 

 

end;

S := 0;

разрешить прерывания; Здесь переключение

процессов невозможно

V(S):

S := 1;

Операционные системы. Управление процессами - 1

39

Реализация семафорных примитивов: вариант с пассивным ожиданием

P(S):

запретить прерывания;

if (S = 0) then begin

перевести текущий процесс в состояние сна; end

else

S := 0;

разрешить прерывания;

V(S):

запретить прерывания;

if (есть спящие процессы, ожидающие освобождения S)

then

разбудить один из этих процессов else

S := 1;

разрешить прерывания;

Операционные системы. Управление процессами - 1

40

Решение проблемы критической секции с помощью семафоров

Процесс A:

Процесс B:

. . . . .

. . . . .

P(S);

P(S);

{Критическая

{Критическая

секция A}

секция B}

V(S);

V(S);

. . . . .

. . . . .

Операционные системы. Управление процессами - 1