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

13 Задача об обедающих философов.

Задача об обедающих философов. За круглым столом расставлены стулья, каждый из которых занимает определенный философ (в первой формулировке Э. Дейкстры число философов равнялось пяти). В центре стола—большое блюдо спагетти, а на столе лежат пять вилок — каждая между двумя соседними тарелками. Каждый философ находится только в двух состояниях — либо он размышляет, либо ест спагетти. Начать думать после еды философу ничто не мешает. Но чтобы начать есть, необходимо выполнить ряд условий. Предполагается, что любой философ, прежде чем начать есть, должен положить из общего блюда спагетти себе в тарелку. Для этого он одновременно должен держать в левой и правой руках по вилке, набрать спагетти в тарелку с их помощью и, не выпуская вилок из рук, начать есть (для простоты здесь вопросы гигиены не рассматриваются). Закончив еду, философ кладет вилки слева и справа от своей тарелки и опять начинает размышлять до тех пор, пока снова проголодается. Нетрудно заметить, что вилки в данной “столовой ситуации” выступают в качестве пересекающихся ресурсов. Неприятная ситуация может возникнуть в случае, когда философы одновременно проголодаются и одновременно попытаются взять, например, свою левую вилку. В данном случае возникает тупиковая ситуация, так как никто из них не может по условию начать есть, не имея второй вилки. Однако вторая вилка может появиться для любого философа только от соседа справа, который в свою очередь ждет появления для себя вилки от своего соседа справа и одновременно не хочет положить свою левую вилку на стол и т. д. Вторая неприятная ситуация (голодание) может возникнуть уже в отношении не всех, а только одного процесса. В обществе философов такая ситуация возникает в случае заговора двух соседей слева и справа против философа, в отношении которого строятся козни. Каждый раз, когда последний желает утолить голод, заговорщики, опережая его, поочередно забирают вилки то слева, то справа от него. Такие согласованные действия злоумышленников приводят жертву к вынужденному голоданию, так как он никогда не может воспользоваться обеими вилками. Построим формальное описание ситуации. Опишем возможные состояния философа: S0. Философ размышляет. В этом состоянии он может проголодаться, что представляется спонтанным переходом в состояние S1. S1. В этом состоянии философ хочет есть, поэтому ему требуются вилки. Философ тянется за вилкой, лежащей слева от него. Если эта вилка отсутствует, то он в состоянии S1 ждет ее освобождения. Если левая вилка свободна, то он ее берет и переходит в состояние S2. S2. В этом состоянии философ ожидает правую вилку. Если правая вилка отсутствует, то он будет находиться в этом состоянии до ее освобождения. Если правая вилка свободна, то он ее берет и переходит в состояние S3 – имея обе вилки, он в этом состоянии ест спагетти. S3. Философ ест. После того, как он поел, он кладет на стол левую вилку, переходя в следующее состояние S4. S4. В этом состоянии философ кладет на стол правую вилку и возвращается к размышлениям (в состояние S0). Существует самое простое решение этой задачи. Процедура доступа к спагетти ждет, пока левая вилка не освободится, и берет ее. Затем ждет осво-бождения правой вилки. После еды возвращает обе вилки на место. К сожа-лению, это решение ошибочно. Допустим, что все пять философов одновре-менно берут левую от себя вилку. Тогда никто из них не сможет взять пра-вую вилку, что приведет к взаимной блокировке. Можно изменить программу так, чтобы после получения левой вилки программа проверяла доступность правой вилки. Если эта вилка недоступна, философ кладет на место левую вилку, ожидает какое-то время, а затем по-вторяет весь процесс. Это предложение также ошибочно, но уже по другой причине. При некоторой доле невезения все философы могут приступить к выполнению алгоритма одновременно, взяв левые вилки и увидев, что пра-вые вилки недоступны, опять одновременно положить на место левые вилки, и так до бесконечности. Подобная ситуация, при которой все программы бес-конечно работают, но не могут добиться никакого прогресса, называется го-лоданием, или зависанием процесса.

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