Page 114 - 4868
P. 114
Ошибка! Стиль не определен. 112
Лістинг 1.27 – Рішення задачі про читачів та письменників з
використанням моніторів
monitor RW_Controller {
int nr = 0, nw = 0;
cond oktoread; # отримує сигнал, коли nw == 0
cond oktowrite; # отримує сигнал, коли nr == 0 та nw == 0
procedure request_read() {
while (nw > 0) wait(oktoread);
nr = nr+1;
}
procedure release_read() {
nr = nr-1;
if (nr == 0) signal(oktowrite);
# запустити один процес-письменник
procedure request_write() {
while (nr > 0 || nw > 0) wait(oktowrite);
nw = nw+1;
}
procedure release_write() {
nw = nw-1;
signal(oktowrite); # запустити один процес-письменник та
signal_all(oktoread); # всі процеси-читачі
}
}
16.2. Реалізаціяінтервального таймера
Розглянемо нову задачу, що полягає у розробці інтервального таймера,
який дозволяє процесу перейти на деякий час в стан очікування. Така
можливість часто надається операційними системами, щоб дозволити
користувачам, наприклад, періодично виконувати службові команди.
Розглянемо два рішення, в яких реалізовано два корисні методи. У першому
рішенні використані так звані покриваючі умови, а у другому –
операторwaitз пріоритетами.
Монітор, який реалізує інтервальний таймер, являє собою ще один
приклад контролера ресурсів. Ресурсом у даному випадку виступає логічний
годинник. При цьому над годинником можливо виконувати такі операції як
delay(interval), яка призупиняє процес на проміжок часу тривалістю
intervalтаtick, що виконує інкремент значення логічного годинника.
Можливі й інші операції, наприклад, отримання значення часу або
призупинення процесу до моменту, поки годинник не досягне певного
значення.
Прикладні процеси викликають операцію delay(interval) з
від’ємним значенням interval, а операцію tick викликає процес, який
періодично запускається апаратним таймером. Даний процес зазвичай має