ВУЗ:
Составители:
72
«писатель» должен приостанавливаться, когда все буфера оказываются
занятыми, и активизироваться при освобождении хотя бы одного буфе-
ра. Напротив, процесс «читатель» приостанавливается, когда все буфе-
ры пусты, и активизируется при появлении хотя бы одной записи. Вве-
дем следующие семафоры:
e – число пустых буферов («e» – empty);
f – число заполненных буферов («f» – full);
b – двоичный семафор, используемый для обеспечения взаимно-
го исключения.
Операции с буфером (запись, считывание) являются критическими
секциями. Процессы могут быть описаны следующим образом:
// Глобальные переменные
#define N 256
int e = N, f = 0, b = 1;
void Writer ()
{
while(1)
{
PrepareNextRecord(); /* подготовка новой записи */
P(e); /* Уменьшить число свободных буферов, если они есть */
/* в противном случае ждать, пока они освободятся */
P(b); /* Вход в критическую секцию */
AddToBuffer(); /* Добавить новую запись в буфер */
V(b); /* Выход из критической секции */
V(f); /* Увеличить число занятых буферов */
}
}
void Reader ()
{
while(1)
{
P(f); /* Уменьшить число занятых буферов, если они есть */
/* в противном случае ждать, пока они появятся */
P(b); /* Вход в критическую секцию */
GetFromBuffer(); /* Взять запись из буфера */
V(b); /* Выход из критической секции */
V(e); /* Увеличить число свободных буферов */
ProcessRecord(); /* Обработать запись */
}
}
Достоинства использования операций на семафоре:
1. Пассивное ожидание (постановка в очередь и автоматическая
выдача ресурсов).
2. Возможность управления группой однородных ресурсов.
Страницы
- « первая
- ‹ предыдущая
- …
- 70
- 71
- 72
- 73
- 74
- …
- следующая ›
- последняя »
