
- •Государственное образовательное учреждение высшего профессионального образования самарская государственная академия путей сообщения
- •Самара 2006
- •Составитель Валерий Анатольевич Засов Рецензенты: к.Т.Н., заведующий научно-исследовательским отделом н.А. Локтев (нпц «Информационные и транспортные системы»);
- •Оглавление
- •1.Задание на курсовую работу по дисциплине
- •2.Построение диаграмм выполнения процессов
- •4.Обнаружение и предотвращение взаимных
- •Библиографический список……………………………………….……...…….44
- •1. Задание на курсовую работу по дисциплине «Операционные системы»
- •Задание №1
- •Задание №2
- •Задание №3
- •Задание №4
- •2. Построение диаграмм выполнения процессов для различных алгоритмов планирования
- •2.1. Алгоритмы планирования мультипрограммных операционных систем
- •2.2. Примеры построения диаграмм выполнения процессов для различных алгоритмов планирования
- •3.Организация синхронизации процессов и потоков
- •3.1. Объекты взаимной синхронизации процессов и потоков
- •3.2. Примеры использования различных объектов синхронизации
- •4. Обнаружение и предотвращение взаимных блокировок
- •4.1. Условия возникновения взаимных блокировок и методы борьбы с ними
- •Существуют следующие методы ликвидации взаимоблокировок:
- •4.2.Пример алгоритма обнаружения блокировок при наличии одного экземпляра ресурсов каждого типа
- •4.3. Пример алгоритма обнаружения блокировок при наличии нескольких экземпляров ресурсов каждого типа
- •4.4. Пример алгоритма банкира для безопасного распределения ресурсов
- •5. Примеры схем арбитажа
- •Библиографический список
4. Обнаружение и предотвращение взаимных блокировок
4.1. Условия возникновения взаимных блокировок и методы борьбы с ними
В мультипрограммной системе процесс находится в состоянии тупика, если он ждет события, которое никогда не произойдет. Группы процессов находятся во взаимной блокировке (тупике), если каждый процесс из группы ожидает событие, которое может вызвать только другой процесс из той же группы. Обычно события, которые ждут процессы, это получение ресурсов.
Существует четыре условия возникновения взаимных блокировок, которые сформулировал Кофман /7-11/:
1)взаимное исключение – каждые ресурс в данный момент времени либо отдан, либо доступен только одному процессу (невозможно совместное использование ресурса);
2)ожидание и удержание – процессы, удерживающие в данный момент времени полученные ресурсы, могут запрашивать новые;
3)отсутствие принудительной выгрузки ресурсов – у процессов нельзя принудительно отобрать полученные ранее ресурсы, процесс, владеющий ресурсами, освобождает их сам, по собственной инициативе;
4)циклическое ожидание – существует замкнутая цепь процессов, каждый из которых ждет ресурс, удерживаемый другим процессом в этой цепи.
Для возникновения взаимной блокировки должны выполняться все четыре условия. Следовательно, разрушить (устранить) блокировку можно ликвидацией одного или нескольких условий Кофмана.
Выделяют четыре стратегии борьбы с тупиками /7-11/:
1)пренебрежение тупиками или блокировками в системе;
2)предотвращение блокировок с помощью опровержения и ликвидации одного из четырех условий их возникновения;
3)обход тупиков с помощью специального распределения ресурсов;
4)распознавание тупика и восстановление системы.
Существуют следующие методы ликвидации взаимоблокировок:
метод восстановления при помощи принудительной выгрузки ресурсов. Отбирается ресурс у процесса–владельца и передается другому процессу. Но отдать ресурс, а затем его получить не всегда возможно;
метод восстановления системы через откат алгоритма. Процессы периодически создают контрольные точки, которые записываются в файл (из этого файла процесс может быть восстановлен). Когда взаимоблокировка обнаружена выполняются следующие действия: 1) определяется какой ресурс требуется дополнительно для выхода из блокировки; 2) процесс, занимающий ресурс, возвращается к точке времени, перед которой этот ресурс был получен, далее ресурс передаётся одному из процессов циклической последовательности;
метод восстановления системы путем уничтожения процессов. Самый простой и грубый способ ликвидации взаимоблокировок: уничтожается процесс, находящийся в циклической последовательности, если его уничтожение не привело к выходу из ситуации взаимоблокировки, то уничтожается следующий процесс и т.д.
4.2.Пример алгоритма обнаружения блокировок при наличии одного экземпляра ресурсов каждого типа
Обнаружение блокировок в вычислительной системе при наличии одного экземпляра ресурсов каждого типа производится на основе анализа построенного графа ресурсов и процессов /6-8/. Наличие циклов в графе указывает на взаимную блокировку в вычислительной системе.
В графе процессы обозначаются как круг с именем процесса, а ресурсы обозначаются как квадрат с именем ресурса. Исходящее ребро от процесса к ресурсу означает, что процесс требует данный ресурс. Входящее ребро от ресурса к процессу означает, что процесс занял данный ресурс.
Один из возможных алгоритмов поиска циклов в графе следующий. Для каждого из N узлов в графе выполняется пять шагов.
1.Задаются начальные условия: L-пустой список, все ребра немаркированы.
2.Текущий узел добавляем в конец списка L и проверяем количество появления узла в списке. Если он встречается два раза, значит цикл и взаимоблокировка.
3.Для заданного узла смотрим, выходит ли из него хотя бы одно немаркированное ребро. Если да, то переходим к шагу 4, если нет, то переходим к шагу 5.
4.Выбираем новое немаркированное исходящее ребро и маркируем его. И переходим по нему к новому узлу и возвращаемся к шагу 3.
5.Зашли в тупик. Удаляем последний узел из списка и возвращаемся к предыдущему узлу. Возвращаемся к шагу 3. Если это первоначальный узел, значит, циклов нет, и алгоритм завершается.
Пример 1. Рассмотрим вычислительную систему, в которой выполняются 10 процессов (A, B, C, D, E, F, G, H, I, J) и используется 8 ресурсов (Q, K, L, N, X, V, T, R). Требуемые и занятые данными процессами ресурсы отображаются табл.4.1, а граф процессов и ресурсов построен на рис. 4.1.
Таблица.4.1
Процесс
Занимает
ресурс
Требует
ресурс
A
Q
N
B
0
K,
X
C
0
L
D
0
Q,
N
E
L
K
F
N
0
G
K
N
H
Q
V
I
V
T
J
X
R
Рис.
4.1. Граф процессов и ресурсов к примеру
1
Проверяем есть ли в данном графе цикл, а значит возможность блокировки.
[C] [B] [B]
[C, L, E] [B, X] [B, K]
[C, L, E, K] [B, X, J] [B, K, G]
[C, L, E, K, G] [B, X, J, R] [B, K, G, N]
[C, L, E, K, G, N] [B, K, G, N, F]
[C, L, E, K, G, N, F]
[D] [D]
[D, Q] [D, Q] [D, N]
[D, Q, H] [D, Q, A] [D, N, F]
[D, Q, H, V] [D, Q, A, N]
[D, Q, H, V, I] [D, Q, A, N, F]
[D, Q, H, V, I, T]
Вывод: в данном графе циклов нет, поэтому блокировки не обнаружено.
Пример 2. Рассмотрим вычислительную систему, в которой выполняются 10 процессов (A, B, C, D, E, F, G, H, I, J) и используется 8 ресурсов (Q, K, L, N, X, V, T, R). Требуемые и занятые данными процессами ресурсы отображаются табл. 4.2, а граф процессов и ресурсов построен на рис. 4.2. Изменим в графе направление ребра DN на противоположное.
Таблица.4.2
Процесс
Занимает
ресурс
Требует
ресурс
A
Q
N
B
0
K,
X
C
0
L
D
N
Q
E
L
K
F
N
0
G
K
N
H
Q
V
I
V
T
J
X
R
П
Рис. 4.2. Граф
процессов и ресурсов к примеру 2
[C]
[C, L]
[C, L, E]
[C, L, E, K]
[C, L, E, K, G]
[C, L, E, K, G, N] [C, L, E, K, G, N]
[C, L, E, K, G, N, F] [C, L, E, K, G, N, D]
[C, L, E, K, G, N, D, Q, ]
[C, L, E, K, G, N, D, Q, A]
[C, L, E, K, G, N, D, Q, A, N]
Вывод: количество появлений узла N в списке 2 раза, следовательно, в графе есть цикл и обнаружена блокировка.
Текст программы graf, реализующей этот алгоритм:
program graf;
type
PPr = ^Pr;
Pr=record
Name:string;
Pred:PPr;
Next:PPr;
end;
type
PResZan = ^ResZan;
ResZan=record
Num:string;
Pred:PResZan;
Next:PResZan;
end;
type
PResZapr = ^ResZapr;
ResZapr=record
Num1:string;
Num2:string;
end;
type
Pspisok = ^spisok;
spisok=record
pole:string;
pred:Pspisok;
next:Psipok;
end;
label s;
var
Process:array [1..10] of Pr;
ZanRes:array [1..10] of ResZan;
ZaprRes:array [1..10] of ResZapr;
Cep:array [1..10] of spisok;
list:array [1..10] of string;
n,i,j,m:integer;
Results:PPr;
begin
writeln(‘Введите число процессов’);
Readln(n);
for i:=1 to n do
begin
writeln(‘Введите название’,i,’-го процесса’);
readln(Process[i].name);
writeln(‘Введите для процесса ‘,Process[i].name,’занятый ресурс’);
readln(ZanRes[i].num);
writeln(‘Введите для процесса ‘,Process[i].name,’1-ый запрашиваемый ресурс’);
readln(ZaprRes[i].num1);
writeln(‘Введите для процесса ‘,Process[i].name,’2-ой запрашиваемый ресурс’);
writeln(‘Если второго запрашиваемого ресурса нет, введите символ *’);
readln(ZaprRes[i].num2);
end;
for i:=1 to 10 do
cep[i].pole:=’0’;
S: i:=1;
cep[i].pred:=ZanRes[i].num;
list[i]:=cep[i].pred;
cep[i].pole:=Process[i].name;
list[i+1]:=cep[i].pole;
if ZaprRes[i].num 1<> ‘*’ then
begin
cep[i].next:=ZaprRes[i].num1;
cep[i+1].pred:=cep[i].next;
list[i+2]:=cep[i].next;
end
else
begin
if ZaprRes[i].num2<>’*’then
cep[i].next:ZaprRes[i].num2;
cep[i+1].pred:=cep[i].next;
list[i+2]:=cep[i].next;
else
begin
cep[i].next:=’0’;
end;
end;
end.