Поведение. Помимо не учитываемых нами процессов размышления и еды, жизнь каждого философа представляет собой повторение цикла из шести событий:
Помимо не учитываемых нами процессов размышления и еды, жизнь каждого философа представляет собой повторение цикла из шести событий:
ФИЛ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; просмотров: 711;
