Page 95 - 4868
P. 95
93 Ошибка! Стиль не определен.
виробник і один споживач. Дана умова гарантує неподільне виконання
операцій deposit та fetch. Тепер припустимо, що є кілька процесів-
виробників. При наявності хоча б двох вільних комірок два з них могли б
виконати операцію deposit одночасно. Але тоді обидва намагалися б
помістити свої повідомлення в одну і ту ж комірку. Аналогічно, якщо є
декілька споживачів, два з них одночасно можуть виконати fetch і отримати
одне й те саме повідомлення. Таким чином, deposit та fetch
перетворюються на критичні секції. Однакові операції повинні виконуватися
із взаємним винятком, але різні можуть виконуватися одночасно, оскільки
при роботі семафорів empty та full виробники і споживачі звертаються до
різних комірок буфера. Необхідне взаємне виключення можна реалізувати,
використовуючи рішення для задачі критичної секції з окремими семафорами
для захисту кожної критичної секції (лістинг 1.16). Закінчене рішення
описаної задачі приведене в лістингу 1.20.
Лістинг 1.20 – Декілька виробників і споживачів, що використовують
семафори
typeT buf[n]; /* масив типу Т */
int front = 0, rear = 0;
sem empty = n, full = 0; /* N-2 <= empty + full <= n */
sem mutexD = 1, mutexF = 1; /* взаємне виключення */
process Producer[i = 1 to M] {
while (true) {
...
створити повідомлення data;
/* помістити data в буфер */
P(empty);
P(mutexD);
buf[rear] = data;
rear = (rear+1) % n;
V(mutexD);
V(full);
}
}
process Consumer[j = 1 to N] {
while (true) {
/* витягти та видалити повідомлення result */
P(full);
P(mutexF);
result = buf[front];
front = (front+1) % n;
V(mutexF);
V(empty);
...
}
}