ОС / 4. ОС - Управление процессами - 1
.pdf
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
