Лекция: Распределения ресурсов
Данный алгоритм был разработан математиком Дийкстрой /6-8/.
Введем следующую аналогию: клиент – процесс, кредит – ресурс, банкир – ОС.
Банкир знает, что не всем клиентам понадобится максимальный кредит немедленно. Поэтому банкир резервирует количество единиц кредита меньше, чем требуемое число кредитов. Клиенты должны получить весь ресурс, в противном случае они не смогут его погасить.
Чтобы проверить безопасное состояние, банкир проверяет поочередно для каждого клиента, может ли он предоставить аналогичное количество ресурсов для завершения работы клиента.
Пример алгоритма банкира.
1.Ищем в матрице R строку, соответствующую процессу, чьи неудовлетворенные потребности ресурсов меньше или равны вектору A, если такой строки нет, то система попадает в тупик.
2.Процесс, чью строку выбрали в пункте 1, запускает все ресурсы, заканчивает работу. Отмечаем этот процесс как завершенный и прибавляем к вектору А. Вектор доступных ресурсов A увеличивается как A=A+C[i], при этом значение матрицы C и R с порядковыми номерами i приравниваем 0.
3.Переход к пункту 2. При этом там же осуществляется проверка, если элемент матрицы R равен 0, то он пропускается и осуществляется переход к следующему элементу.
Повторяем шаги 1,2 до тех пор, пока все процессы не будут завершены, если не встретится тупиков.
Пример 1.Количество существующих ресурсов одного типа Е = 18. Количество процессов – 5: Р1, Р2, Р3, Р4, Р5. Количество доступных ресурсов: А = 3
— матрица начального распределения ресурсов С;
— матрица требуемых ресурсов R, в сумме требуется 23 ед. ресурсов.
Находим в матрице R строку, меньшую или равную А. Эта строка соответствует процессу Р4. R4 = A. Выполняется процесс Р4.
А = А + С4 = 3 + 1 = 4.
R3 = A. Выполняется процесс Р3.
А = А + С3 = 4+2 = 6.
R5 = A. Выполняется процесс Р5.
А = А + С5 = 6+5 = 11.
R2 < A. Выполняется процесс Р2.
А = А + С2= 11+4 = 15.
R1 < A. Выполняется процесс Р1.
А = А + С1= 15+3= 18.
Все процессы успешно завершены.
Пример 2.Количество существующих ресурсов одного типа Е = 11. Количество процессов – 5: Р1, Р2, Р3, Р4, Р5. Количество доступных ресурсов: А = 3
— матрица начального распределения ресурсов С;
— матрица требуемых ресурсов R, в сумме требуется 30 ед. ресурсов.
Находим в матрице R строку, меньшую или равную А. Эта строка соответствует процессу Р1. R1 = A. Выполняется процесс Р1.
А = А + С1 = 3 + 1 = 4
Далее ни один процесс не может быть выполнен, такое распределение ресурсов невозможно.
Текст программы bankir, реализующей этот алгоритм:
program bankir;
var
E, A, i, Sum, n, z, min: integer;
C, R: array [1..4] of integer;
label povt, vyvod, exit;
begin
Writeln (‘VVedite chislo imeyushihsya resursov’);
Readln (E);
Writeln (‘VVedite chislo dostupnyh resursov’);
Readln (A);
for i:=1 to 4 do
begin
Writeln (‘VVedite chislo resursov, trebuemyh klientu’,i);
Readln (R [i]);
end;
for i:=1 to 4 do
begin
Writeln (‘VVedite chislo resursov, kreditovannyh klientu’,i);
Readln (C [i]);
end;
Sum:=0;
//Расчет вектора требуемых ресурсов с учетом выдачи кредита и подсчет количества выданного кредита
for i:=1 to 4 do
begin
Sum:= Sum + C [i];
R [i]:= R [i] – C [i];
end;
A: = A – Sum;
//Определение возможности кредитования
If ((R [1] > A) and (R [2] > A) and (R [3] > A) and (R [4] > A)) then
begin
writeln (‘Takoe kreditovanie nevozmozhno!!!’);
goto exit;
end;
//Определение клиента, запросы на ресурсы которого можно удовлетворить
for i:=1 to 4 do
begin
if R [i] < = A then
begin
n:=i;
R[i]:=o;
end;
end;
A:= A + C [n];
//Проверка выплат клиентами выданных кредитов
povt:
min:= R [1];
for i:=2 to 4 do
begin
if ((min > = R [i]) and (R[i]<>0)) then
begin
min:= R [i];
z:=i;
end
else
begin
min:= R [1];
A: = A + C [1];
R [1]:= 0;
goto vyvod;
end;
end;
A: = A + C [z];
R [z]:=0;
for i:=1 to 4 do
begin
if R [i] <> 0 then goto povt else goto vyvod;
end;
vyvod;
Writeln (‘Vse kredity vydany i pogasheny!’);
exit;
end.