Поведение. Помимо не учитываемых нами процессов размышления и еды, жизнь каждого философа представляет собой повторение цикла из шести событий:
Помимо не учитываемых нами процессов размышления и еды, жизнь каждого философа представляет собой повторение цикла из шести событий:
ФИЛi = (i.садится i.берет вил.i i.берет вил.(i +5 1)
i.кладет вил.i i.кладет вил.(i +5 1) → i.встаёт ФИЛi).
Вилку циклически берёт и кладёт на место кто-нибудь из соседних с ней философов:
ВИЛКАi = (i.берет вил.i, i.кладёт вил.i ВИЛКАi | (i -5 1).берет вил.i
(i -5 1).кладёт вил.i ВИЛКАi).
Поведение всего пансиона можно описать как параллельную комбинацию поведения компонент:
ФИЛОСОФЫ = (ФИЛ0 || ФИЛ1 || ФИЛ2 || ФИЛ3 || ФИЛ4 )
ВИЛКИ = (ВИЛКА0 || ВИЛКА1 || ВИЛКА2 || ВИЛКА3 || ВИЛКА4 )
ПАНСИОН = (ФИЛОСОФЫ || ВИЛКИ).
В одном из интересных вариантов этой историй философы могут брать и класть обе вилки в любом порядке. Рассмотрим поведение каждой руки философа в отдельности.
aЛЕВАЯi = {i.садится, i.встаёт, i.берет вил.i, i.кладёт вил.i}.
aФИЛi = {i.садится, i.встаёт, i.берет вил.(i +5 1), i.кладёт вил.(i +5 1)}.
ЛЕВАЯi = (i.садится i.берет вил.i i.кладет вил.i i.встаёт ЛЕВАЯi).
ПРАВАЯi = (i.садится i.берет вил.(i +5 1) i.кладет вил.(i +5 1)
i.встаёт ПРАВАЯi).
ФИЛi = (ЛЕВАЯi || ПРАВАЯi ).
Синхронизацией процессов ЛЕВАЯi и ПРАВАЯi в момент, когда i-тый философ садится или встаёт, достигается то, что он не может поднять вилку, если не сидит за столом, и не может встать из-за стола, пока не положит вилку. Помимо этого, операции с обеими вилками произвольно чередуются.
Тупик!
Построенная математическая модель позволяет обнаружить опасность возникновения тупиковой ситуации, когда каждый из философов, сев за стол, возьмёт вилку в левую руку и потянется за второй – которой уже нет на месте. Несмотря на то, что каждый из участников способен к дальнейшим действиям, ни одна пара участников не в состоянии договориться о том, какое действие совершить следующим.
Одним из решений этой проблемы явилось введение в систему слуги. Слуге даётся указание следить за тем, чтобы за столом никогда не оказывалось больше четырех философов одновременно. Алфавит его определяется как C B, где
C = {0.садится, … , 4.садится }, B = {0.встаёт, … , 4.встаёт}.
Поведение слуги проще всего описать с помощью взаимной рекурсии. Пусть СЛУГАj определяет поведение слуги, когда за столом сидят jфилософов:
СЛУГА0 =(x: C СЛУГА1),
СЛУГАj =(x: C СЛУГАj+1) | y: B СЛУГАj-1), для j {1,2.3}.
СЛУГА4 =(y: B СЛУГА3).
Пансион, свободный от тупика, определяется как
НОВПАНСИОН = ((ПАНСИОН || СЛУГА0).
Дата добавления: 2015-07-18; просмотров: 639;