Page 66 - 4868
P. 66
Ошибка! Стиль не определен. 64
<await (!in2) in1 = true;>
Оскільки процеси симетричні відносно один-одного, то у вхідному
протоколі процесу CS2 використовується аналогічна умовна неподільна
операція.
Рішення даної задачі показано в лістингу 1.3.Дана програма задовольняє
умові взаємного виключення.Взаємного блокування не виникає, оскільки
якби кожен процес був заблокований в своєму протоколі входу, то обидві
змінні in1 та in2, мали б значення «істина», а це суперечить тому, що в
даній точці коду обидві вони мають значення «хиба».Зайвих затримок також
немає, оскільки один процес блокується, тільки якщо інший перебуває в
критичній секції, тому небажаних затримок під час виконання програми не
виникає.
Лістинг 1.3– Задача критичної секції (крупномодульне рішення)
bool in1 = false, in2 = false;
process CS1 {
while (true) {
<await (!in2) in1 = true;> /* вхід */
критична секція;
in1 = false;/* вихід */
некритична секція;
}
}
process CS2 {
while (true) {
<await (!in1) in2 = true;> /* вхід */
критична секція;
in2 = false;/* вихід */
некритична секція;
}
}
10.2. Активні блокування у задачі критичної секції
У крупномодульному рішенні, наведеному в лістингу 1.3,
використовуються дві змінні.При узагальненні даного рішення для n
процесів знадобиться n змінних.Однак існує тільки два цікавих для нас
стани: 1)деякий процес знаходиться у своїй критичній секції; 2) усі процеси
знаходяться поза межами критичної секції.Незалежно від числа процесів, для
того, щоб розрізнити ці два стани, достатньо однієї змінної.
Нехай lock – логічна змінна, яка показує, чи знаходиться процес в
критичній секції, тобтоlockмає значення «істина», якщо одна з змінних in1
або in2має значення «істина», в іншому випадку lock має значення
«хиба».Таким чином, отримаємо наступну умову:
lock == (in1 in2)