Алгоритм банкира
Структуры данных для алгоритма банкира
Пусть в системе имеется n процессов и m типов ресурсов.
Вектор Available длины m содержит информацию о доступных ресурсах. Если Avaliable[j] = k,то в системе в данный момент доступно k единиц ресурса j.
Матрица Max ( n * m ) отображает максимальные потребности процессов в ресурсах. Если Max [i, j] = k,то процесс i может запросить, самое большее, k единиц ресурса j.
Матрица Allocation ( n * m ) отображает фактическое выделение системой ресурсов. Если Allocation [i, j] = k,то процессу i в данный момент выделено системой k единиц ресурса j.
Матрица Need ( n * m ) отображает оставшиеся потребности процессов в ресурсах. Если Need [i, j] = k,то процессу i могут потребоваться еще k единиц ресурса j для завершения работы.
Имеет место следующее соотношение между элементами матриц:
Need [i, j] = Max [i, j] – Allocation [i, j].
Алгоритм проверки состояния системы на безопасность
В обозначениях раздела Структуры данных для алгоритма банкира, рассмотрим алгоритм проверки состояния системы на то, является ли оно безопасным.
Введем целочисленный вектор Work (длины m ) и булевский вектор Finish (длины n ). Вектор Work отображает пробные выделения ресурсов. Вектор Finish представляет информацию о завершаемости процессов при данном состоянии системы.
Алгоритм безопасности.
Шаг 1. Инициализация. Work = Available Finish [i] = false для i = 1, …, n.
Здесь и в дальнейшем все присваивания и сравнения, в которых участвуют векторы или матрицы, выполняются поэлементно.
Шаг 2. Находим i, такое, что: Finish [i] = false Need [i] <= Work
Если такого i нет, переходим к шагу 4.
Шаг 3. Work = Work + Allocation [i] Finish [i] = true Переход к шагу 2. Шаг 4. Если Finish[i] = true для всех i = 1, …, n, то система в безопасном состоянии.
Необходимые пояснения к алгоритму:
- Алгоритм строит безопасную последовательность номеров процессов i, если она существует. На каждом шаге, после обнаружения очередного элемента последовательности, алгоритм моделирует освобождение i - м процессом ресурсов после его завершения.
- На шаге 1 присваивание векторов выполняется поэлементно.
- На шаге 2, Need – матрица потребностей ( n * m ); Need[i] - строка матрицы, представляющая вектор потребностей (длины m ) процесса i. Сравнение выполняется поэлементно, и его результат считается истинным, если соотношение выполнено для всех элементов векторов. Проверяемое условие означает, что потребности процесса i с найденным номером могут быть удовлетворены немедленно, и процесс может получить их и завершиться.
- На шаге 3, Allocation [i] – строка матрицы Allocation, обозначающая текущие ресурсы, выделенные процессу i. С помощью вектора Work моделируется освобождение ресурсов i – м процессом, после чего процессу присваивается признак завершаемости.
Формальное доказательство корректности алгоритма и оценку его сложности предоставляем студенту.
Алгоритм запроса ресурсов для процесса Pi – основная часть алгоритма банкира
Для основного алгоритма введем вектор Requesti (длины m ) – вектор запросов для процесса Pi . Если Requesti [j] = k,то процесс Pi запрашивает k экземпляров ресурса Rj.
Шаг 1. Если Requesti <= Need[i], перейти к шагу 2. Иначе – сгенерировать исключительную ситуацию (процесс превысил свои максимальные потребности). Шаг 2. Если Requesti <= Available, перейти к шагу 3. Иначе процесс должен ждать, так как ресурс недоступен. Шаг 3. Спланировать выделение ресурса процессу Pi , модифицируя состояние системы следующим образом: Available = Available - Requesti Allocation = Allocation + Requesti Need [i] = Need [i] - Requesti Вызвать алгоритм проверки безопасности полученного состояния. Если состояние безопасно, выделить ресурс процессу Pi . Выход. Если состояние небезопасно, восстановить предыдущее состояние; процесс должен ждать.
Пример использования алгоритма банкира
Пусть имеется 5 процессов – P0 , …, P4 , и 3 типа ресурсов – ресурс A (10 экземпляров), ресурс B (5 экземпляров) и ресурс C (7 экземпляров). Пусть состояние системы в момент T0 следующее:
Allocation | Max | Available | |||||||
---|---|---|---|---|---|---|---|---|---|
A | B | C | A | B | C | A | B | C | |
P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 |
P1 | 2 | 0 | 0 | 3 | 2 | 2 | |||
P2 | 3 | 0 | 2 | 9 | 0 | 2 | |||
P3 | 2 | 1 | 1 | 2 | 2 | 2 | |||
P4 | 0 | 0 | 2 | 4 | 3 | 3 |
Вычислим матрицу потребностей Need = Max – Allocation:
Нетрудно видеть, что система – в безопасном состоянии. Последовательность процессов <P1, P3, P4, P2, P0> удовлетворяет критерию безопасности. Проверку предоставляем студенту.
В продолжение примера, предположим, что процесс P1 сделал запрос (1 0 2). Проверяем, что Request <= Available: <(1 0 2) <= (3 3 2) = true.
Состояние системы принимает вид:
Allocation | Max | Available | |||||||
---|---|---|---|---|---|---|---|---|---|
A | B | C | A | B | C | A | B | C | |
P0 | 0 | 1 | 0 | 7 | 4 | 3 | 2 | 3 | 0 |
P1 | 3 | 0 | 2 | 0 | 2 | 0 | |||
P2 | 3 | 0 | 1 | 6 | 0 | 0 | |||
P3 | 2 | 1 | 1 | 0 | 1 | 1 | |||
P4 | 0 | 0 | 2 | 4 | 3 | 1 |
Исполнение алгоритма безопасности показывает, что последовательность процессов <P1, P3, P4, P0, P2> удовлетворяет критерию безопасности. Предоставляем студенту проверку корректности данных преобразований и предлагаем ответить на следующие дополнительные вопросы:
- может ли быть удовлетворен запрос (3 3 0) для процесса P4 ?
- может ли быть удовлетворен запрос (0 2 0) для процесса P0 ?