Операционные системы



УПРАВЛЕНИЕ АСИНХРОННЫМИ ПАРАЛЛЕЛЬНЫМИ - часть 6


#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();  /* Обработать запись                              */

}

}

Общая схема использования семафоров на критических участках для двух процессов приведена на рис.4.3.

Достоинства использования операций на семафоре:

1.Пассивное ожидание (постановка в очередь и автоматическая выдача ресурсов)

2.Возможность управления группой однородных ресурсов.

Рис.4.3. Критические участки с использованием операций на семафоре

Недостатки:

Неправильное либо умышленное использование операций на семафоре приводит к нарушению работоспособности параллельных систем.

Действительно, если в рассмотренном примере переставить местами операции P(e) и P(b) в программе "писатель", то при некотором стечении обстоятельств эти два процесса могут взаимно заблокировать друг друга. Так, пусть "писатель" первым войдет в критическую секцию и обнаружит отсутствие свободных буферов; он начнет ждать, когда "читатель" возьмет очередную запись из буфера, но "читатель" не сможет этого сделать, так как для этого необходимо войти в критическую секцию, вход в которую заблокирован процессом "писатель".




Содержание  Назад  Вперед