Page 81 - 6571
P. 81
вони мають значення «хиба». Зайвих затримок також немає, оскі-
льки один процес блокується, тільки якщо інший перебуває в
критичній секції, тому небажаних затримок під час виконання
програми не виникає.
Лістинг 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 Активні блокування у задачі критичної секції
У крупномодульному рішенні, наведеному в лістингу 3, ви-
користовуються дві змінні. При узагальненні даного рішення для
n процесів знадобиться n змінних. Однак існує тільки два цікавих
для нас стани: 1) деякий процес знаходиться у своїй критичній
секції; 2) усі процеси знаходяться поза межами критичної секції.
Незалежно від числа процесів, для того щоб розрізнити ці два
стани, достатньо однієї змінної.
Нехай lock – логічна змінна, яка показує, чи знаходиться
процес в критичній секції, тобто lock має значення «істина»,
якщо одна з змінних in1 або in2має значення «істина», в іншому
випадку lock має значення «хиба». Таким чином, отримаємо на-
ступну умову:
lock == (in1 Úin2)
80