Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_po_OSyam.doc
Скачиваний:
27
Добавлен:
27.09.2019
Размер:
493.06 Кб
Скачать

6.5. Задача Дейкстры об обедающих философах

Неформальная постановка задачи

Пять философов сидят за круглым столом. Перед каждым столом философом находится блюдо спагетти, которое наполняет специальный слуга. На столе лежат ровно пять вилок – по одной между каждыми двумя философами соседями. Каждый из пяти философов ведет простую жизнь:

- некоторое время он предается размышлениям

- некоторое время ест спагетти

Проблема состоит в том, что спагетти можно есть только двумя вилками, которые лежат рядом с тарелкой. Требуется обеспечить такой порядок приема пищи философами, чтобы никто из них не умер с голоду.

Возможное решение задачи

#define THINKING 0

#define HUNGRY 1

#define EATING 2

#define LEFT (i+4)%5

#define RIGHT (i+1)%5

int state[5]; //состояния философов

Semaphore s[5] = {0,0,0,0,0}; //один семафор на философа

Semaphore mutex(1); //взаимное исключение

void philosopher (int i)

{

while (true)

{

think();

take_forks(i);

eat();

put_forks(i);

}

}

void take_forks(int i)

{

mutex.wait();

state[i] = HUNGRY;

test(i); //попробовать взять две вилки

mutex.signal();

s[i].wait(); //заблокироваться, если вилки недоступны

}

void put_forks(int i)

{

mutex.wait();

state[i] = THINKING;

test(LEFT); //разрешить есть соседу слева

test(RIGHT); //разрешить есть соседу справа

mutex.signal();

}

void test (int i) // i – номер философа

{

if (state[i]==HUNGRY && state[LEFT]!=EATING &&s tate[RIGHT]!=EATING)

{

state[i] = EATING;

s[i].signal();

}

}

Вопрос№40 7. Тупики (deadlocks)

7.1.

Поток находится в тупике, если он ожидает событие, которое никогда не произойдет. Событие не может произойти никогда по следующим двум причинам:

- не существует потока, который оповещает о наступлении данного события;

- такой поток существует, но сам находится в тупике.

Будем считать, что процесс находится в тупике, если находится в тупике хотя бы один поток этого процесса.

Вопрос№41 7.2. Классификация ресурсов по доступу:

- совместно используемые ресурсы;

- монопольные ресурсы

Совместно используемый ресурс может одновременно использоваться несколькими потоками, например, файл. Монопольный ресурс может быть предоставлен потоку только в монопольное использование, например, принтер.

Классификация ресурсов по способу распределения:

- перераспределяемые (preemptable) ресурсы;

- не перераспределяемые (non-preemptable) ресурсы.

Перераспределяемый ресурс может быть отобран у потока, владеющего этим ресурсом, и распределен другому потоку, например, страница реальной памяти.

Не перераспределяемый ресурс не может быть отобран у потока, который владеет этим ресурсом, например, принтер.

Классификация ресурсов по времени существования:

- повторно используемые ресурсы;

- потребляемые ресурсы.

Повторно используемый ресурс может использоваться потоками многократно, например, принтер.

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

Вопрос№42 7.3. Граф распределения ресурсов

Для обнаружения тупиков определим граф распределения ресурсов процесса

Граф ресурсов процессса – это ориентированный граф, вершины которого обозначают потоки, а дуги интерпретируются следующим образом:

- случай повторно используемых ресурсов: поток T1 запрашивает ресурс R, занятый потоком T2

- случай потребляемых ресурсов: поток T1 потребляет ресурс R, произведенный потоком T2

Вопрос№43 7.4. Обнаружение тупиков в случае повторно используемых ресурсов

Рассмотрим процесс, в котором потоки используют только повторно используемые ресурсы. В этом случае поток такого процесса находится в тупике, если он бесконечно долго ждет ресурс, захваченный другим потоком.

Теорема 1 (критерий тупика в случае повторно используемых ресурсов):

Процесс, в котором потоки используют только повторно используемые ресурсы, находится в тупике тогда и только тогда, когда граф распределения ресурсов этого процесса содержит цикл.

Доказательство:

Необходимость. Доказываем от противного.

Пусть процесс находится в тупике. Построим граф G распределения ресурсов этого процесса. Предположим, что этот граф не содержит циклов. Возьмем произвольную вершину v графа G и найдем все пути, началом которых служит эта вершина. Каждый из этих путей не образует цикл (по предположению). Значит, потоки, которые являются концами путей, завершат свою работу и освободят захваченные ими ресурсы. Следовательно, будут разблокированы потоки, которые связаны с концевыми вершинами.

Повторяя эти рассуждения, в конце концов получим, что будет разблокирован поток, представленный вершиной v. Получили противоречие с условием, что процесс находится в тупике. Значит, наше предположение неверно, и в графе распределения ресурсов есть цикл.

Достаточность. Пусть граф распределения ресурсов содержит цикл: T1, T2, …, Tn, T1. Поток T1 будет заблокирован до тех пор, пока ресурс, требуемый этим потоком, не будет освобожден потоком T2.

П

void thread2()

{

EnterCriticalSection(&cs2);

cin>>a;

EnterCriticalSection(&cs1);

y=a+b;

LeaveCriticalSection(&cs1);

LeaveCriticalSection(&cs2);

}

овторяя эти рассуждения, получим, что поток T1 будет заблокирован до тех пор, пока поток Tn не освободит ресурс, требуемый потоком Tn-1. Но этого не произойдет никогда, так как поток Tn ждет ресурс, захваченный самим потоком T1. Следовательно, процесс находится в тупике.

Пример тупика.

void thread1()

{

EnterCriticalSection(&cs1);

c in>>a;

EnterCriticalSection(&cs2);

x=a-b;

LeaveCriticalSection(&cs2);

LeaveCriticalSection(&cs1);

}

прерывание потока thread1 и передача управления потоку thread2

Вопрос№44 7.5. Обнаружение тупиков в случае потребляемых ресурсов

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

Пусть G – граф распределения ресурсов такого процесса.

Подграф H графа G называется узлом, если:

- через все вершины графа H проходит цикл;

- для каждой дуги, связывающей подграф G\H с подграфом H, вершина из подграфа G\H является началом этой дуги, вершина из подграфа H – концом этой дуги.

Теорема 2 (критерий тупика в случае потребляемых ресурсов):

Процесс, в котором потоки используют только потребляемые ресурсы, находится в тупике тогда и только тогда, когда граф распределения ресурсов этого процесса содержит узел.

Доказывается теорема аналогично теореме 1.

Вопрос№45 7.6. Восстановление после обнаружения тупика

После обнаружения тупика должно быть выполнено восстановление процесса, которое заключается в разблокировании потоков этого процесса. Существует 3 подхода к восстановлению процесса:

1. Перераспределение ресурсов (preemption)

2. Прекращение работы заблокированных потоков (termination).

3. Откат на контрольную точку (rollback).

Перераспределение ресурсов (preemption).

Этот подход к восстановлению процесса – самый лучший, но редко может быть осуществим на практике по причине невозможности перераспределения ресурсов.

Прекращение работы заблокированных потоков.

Этот подход к восстановлению процесса – самый плохой, так как нарушается целостность обрабатываемой информации. Однако, этот подход можно применять в случае, если потерянная информация не является существенной.

Откат на контрольную точку.

Этот подход к восстановлению процесса применяется наиболее часто. Но при реализации этого подхода должны быть решены две проблемы:

- корректное освобождение ресурсов, захваченных заблокированным потоком;

- восстановление информации на момент, предшествующий тупику.

Для реализации этого подхода в программе устанавливаются такие точки, в которых запоминается состояние контекста потока. Эти точки называются контрольными точками потока. Изменение контекста потока между двумя контрольными точками называется транзакцией.

Транзакция может быть зафиксирована или отменена. Отмена транзакции называется откатом на контрольную точку. При откате выполняются следующие действия:

- контекст потока восстанавливается в состояние, в котором он находился в контрольной точке;

- восстанавливаются данные на момент прохождения контрольной точки;

- освобождаются заблокированные ресурсы.

После отката потоки разблокируются. Если транзакция зафиксирована, то откат на контрольную точку невозможен.

Вопрос№46 7.7. Предотвращение тупиков.

Для того, чтобы избежать возникновения тупиков, можно использовать следующие стратегии при распределении ресурсов.

1. Захват всех ресурсов

Поток должен захватывать сразу все необходимые ему для работы ресурсы и только потом начинать свою работу. Недостаток подхода: неэффективное использование ресурсов компьютера, так как они блокируются для использования другими потоками.

2. Откат в случае отказа

Если в процессе работы потоку требуется дополнительный ресурс, но он получает отказ на захват этого ресурса, то поток должен освободить все принадлежащие ему ресурсы. Недостаток подхода: затраты на откат потока.

3. Упорядочивание запросов

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

Вопрос№47 7.8. Алгоритм банкира для одного типа ресурсов

Алгоритм банкира – позволяет избежать тупик. Этот алгоритм разработан Э.Дейкстра (1965). Моделью алгоритма является работа банкира по обеспечению клиентов кредитами.

Задача состоит в следующем: банкир имеет ограниченное количество денег для выдачи кредитов. Требуется обеспечить клиентов кредитами:

- кредит может выдаваться по частям;

- каждый кредит не превышает ресурсов банкира;

- сумма кредитов может превышать ресурсы банкира.

Аналогии в программных системах:

- банкир – сервер;

- клиент – клиент;

- кредит – ресурс.

Для работы алгоритма определяются следующие состояния системы:

- состояние считается безопасным, если система гарантирует невозможность возникновения тупика при распределении ресурсов;

- иначе состояние называется небезопасным.

Алгоритм банкира рассматривает запросы на ресурсы и проверяет, к какому состоянию системы приведет выделение ресурса.

Примеры состояний системы.

Банкир имеет 10 единиц ресурса для выдачи кредита.

1. Безопасное состояние

Клиенты

Выделено ресурсов

Максимальная потребность

A

0

6

B

0

5

C

0

4

D

0

7

2. Безопасное состояние

Клиенты

Выделено ресурсов

Максимальная потребность

A

1

6

B

1

5

C

2

4

D

4

7

Свободно 2 единицы ресурса

3. Небезопасное состояние

Клиенты

Выделено ресурсов

Максимальная потребность

A

1

6

B

2

5

C

2

4

D

4

7

Свободна 1 единицы ресурса

Блок-схема алгоритма банкира

Запрос ресурса

Состояния безопасное?

Выделить ресурс

Отказать в ресурсе

Задача №1

Процесс включает 5 потоков:

Ti, 1<=i<=5,

которые используют 9 повторно используемых ресурсов:

Rj, 1<=j<=9

Потоки процесса выполнили следующие запросы на распределение ресурсов:

- поток T1:

  • захватил ресурс R1;

  • ждет ресурсы R7, R9;

- поток T2:

  • захватил ресурсы R2, R6;

  • ждет ресурс R8;

- поток T3:

  • захватил ресурс R3;

- поток T4:

  • захватил ресурсы R7, R8;

  • ждет ресурс R5;

- поток T5:

  • захватил ресурсы R5, R9;

  • ждет ресурс R6.

Требуется определить, находится ли процесс в тупике.

Решение:

  1. Определяем потоки, которые находятся в состоянии ожидания: T1, T2, T4, T5.

  2. Строим граф распределения ресурсов для этих потоков.

3. Так как граф распределения ресурсов содержит цикл: (T2, T4), (T4,T5), (T5, T2), то процесс находится в тупике

Задача №2.

В системе работают n процессов, которые используют m ресурсов типа R. Пусть каждому процессу выделено Pi ресурсов и для каждого процесса известно Mi – максимальное количество ресурсов, которые он может использовать, 1<=i<=n.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]