Запрос на вход в КС. Когда процессу Рi нужен доступ к КС, он переходит в состояние запроса на вход в КС, фиксируя показания своих скалярных часов Li, и рассылает сообщение REQUEST(Li, i) всем остальным процессам. Когда процесс Рj получает запрос
REQUEST(Li, i) от процесса Рi, он отправляет процессу Рi ответ REPLY в случае, если Рj находится в состоянии выполнения вне КС, или в случае, если Рj находится в состоянии запроса на вход в КС и отметка времени (Lj, j) его запроса больше отметки времени (Li, i) запроса процесса Рi. В противном случае Рj откладывает отправку ответного сообщения REPLY и устанавливает DRj[i] = 1.
Вход в КС. Процесс Рi может войти в КС, если он получил ответные сообщения REPLY от всех остальных процессов.
Выход из КС. При выходе из КС процесс Рi рассылает отложенные сообщения REPLY всем ожидающим процессам, т.е. всем процессам Рj, для которых DRi[j] = 1, и затем устанавливает DRi[j] = 0.
Представленный алгоритм удовлетворяет требованиям безопасности и живучести для решения задачи взаимного исключения.
Докажем выполнение свойства безопасности от противного. Пусть два процесса Pi и Рj выполняются в КС одновременно, и отметка времени запроса Pi меньше отметки времени запроса Рj. Процесс Рj может войти в КС, только когда он получит ответные сообщения от всех остальных процессов. При этом сообщение с запросом от Рj достигло Pi после того, как Pi отправил свой запрос; в противном случае отметка времени запроса Pi должна была бы быть больше отметки времени запроса Рj по правилам работы логических часов. По условиям алгоритма процесс Pi не может отослать ответное сообщение REPLY процессу Рj, находясь в состоянии запроса на вход в КС и имея меньшее значение отметки времени своего запроса, до тех пор, пока Pi не выйдет из КС. Таким образом мы получаем противоречие с предположением, что Рj получил ответные сообщения REPLY от всех процессов в системе, в том числе, от процесса Pi.
Покажем теперь, что алгоритм Рикарта-Агравала обладает свойством живучести. Процесс Pi не сможет получить доступ к КС, если он отправил свой запрос, но не получил необходимого ответа хотя бы от одного процесса Pj. В этом случае мы будем говорить, что Pi ждет Pj. Эта ситуация возможна, если процесс Pj находится либо в состоянии выполнения внутри КС, либо в состоянии запроса на вход в КС. При этом отметка времени запроса Pj должна быть меньше отметки времени запроса Pi. Если Pj выполняется внутри КС, то через ограниченное время он выйдет из КС и отправит ответное сообщение процессу Pi. Если же Pj находится в состоянии запроса на вход в КС, то либо он войдет в КС, либо должен существовать другой процесс Pk такой, что Pj ждет Pk. Продолжая эти рассуждения, мы построим цепь из процессов, ожидающих друг друга: Pi ждет Pj, Pj ждет Pk, Pk ждет Pm, и т.д. Важно отметить, что эта цепь имеет ограниченную длину и является ациклической: процессы располагаются в ней в порядке убывания отметок времени запросов. Последний процесс Pl
в этой цепи с наименьшим временем запроса либо выполняется в КС, либо получит разрешения от всех остальных процессов и сможет войти в КС. При выходе из КС Pl разошлет ответные сообщения всем ожидающим процессам, в том числе процессу, стоящему непосредственно слева от него, тем самым позволяя этому процессу войти в КС. Поэтому за ограниченное число шагов любой процесс окажется последним в цепи ожидающих процессов и сможет войти в КС.
Из этих рассуждений видно, что в алгоритме Рикарта-Агравала, также как и в алгоритме Лэмпорта, доступ к КС предоставляется строго в соответствии с отметками времени запросов по порядку, сохраняющему частичный причинно-следственный порядок →. Отсюда следует, что после получения сообщения REQUEST от процесса Pi всеми процессами ни один из них не сможет войти в КС более одного раза вперед Pi. Обратим также внимание, что в отличие от алгоритма Лэмпорта, в котором запросы на доступ КС явным образом выстраивались в очередь, в алгоритме Рикарта- Агравала процессы, желающие войти в КС, неявно упорядочиваются в ациклическую цепь, в которой каждый процесс ожидает поступления разрешений от процессов, стоящих справа от него.
Пример работы алгоритма Рикарта-Агравала приведен на рис. 4.3. Также как и в сценарии, представленном выше для алгоритма Лэмпорта, на рис. 4.3а процессы Р2 и Р3 запрашивают вход в КС приблизительно в одно и то же время. На рис. 4.3б процессы Р1 и Р3 получают запрос от Р2 и отправляют ему ответные сообщения. В свою очередь процесс Р2, получив запрос от Р3, откладывает отправку ответного сообщения, т.к. Р2 находится в состоянии запроса на вход в КС и отметка времени его запроса меньше отметки времени запроса Р3. Соответствующий элемент массива DR2 устанавливается в единицу. Поэтому процесс Р3 не сможет получить доступ к КС до тех пор, пока Р2 не войдет и не выйдет из нее. Далее в нашем сценарии процесс Р1 переходит в состояние запроса на вход в КС и рассылает соответствующее сообщение остальным процессам, как показано на рис. 4.3б. Между тем, получив необходимые ответы от Р1 и Р3, процесс Р2 входит в КС – см. рис. 4.3в. Затем запрос от процесса Р1 достигает процессов Р2 и Р3. Обратим внимание, что при получении запроса от Р1 процессы Р2 и Р3 не отправляют ответные сообщения, т.к. Р2 находится в состоянии выполнения в КС, а Р3 находится в состоянии запроса на вход в КС и отметка времени его запроса меньше отметки времени запроса Р1. В итоге цепь ожидающих процессов будет выглядеть следующим образом: Р1 ждет Р3, Р3 ждет Р2. Эта ситуация проиллюстрирована на рис. 4.3в. Действительно, процесс Р3 знает о том, что его ждет процесс Р1, т.к. DR3[1] = 1, а процесс Р2 знает о том, что его ждут процессы Р1 и Р3, т.к. DR2[1] = 1 и DR2[3] = 1.
(ж)
Рис. 4.3. Пример работы алгоритма Рикарта-Агравала.
На рис. 4.3г процесс Р2 выходит из КС и рассылает отложенные ответы ожидающим процессам Р1 и Р3. Теперь последним в цепи ожидающих процессов оказывается процесс Р3, и он войдет в КС следующим. На рис. 4.3д запрос процесса Р3 достигает процесса Р1, и, несмотря на то, что сам Р1 находится в состоянии запроса на вход в КС, он высылает Р3 ответ, т.к. отметка времени запроса Р1 больше отметки времени запроса Р3. По получению необходимых ответов Р3 входит в КС. Когда Р3 выйдет из КС, он отправит Р1 отложенный ответ, и Р1 сможет войти в КС, как показано на рис. 4.3е. На рис. 4.3ж процесс Р1 выходит из КС. При этом ему не требуется рассылать никаких сообщений.
Отметим, что в отличие от алгоритма Лэмпорта, алгоритм Рикарта- Агравала использует для работы с КС 2(N – 1) сообщений: (N – 1) сообщений требуется для входа в КС и (N – 1) сообщений требуется для выхода из КС.
Do'stlaringiz bilan baham: |