Операционные системы. Кручинин А.Ю. - 7 стр.

UptoLike

Составители: 

7
помещает данные в буфер и увеличивает значение count.
Код программы потребителя прост: сначала проверить, не равно ли значение
count нулю. Если равно, то уйти в состояние ожидания; иначе забрать порцию
данных из буфера и уменьшить значение count. Каждый из процессов также должен
проверять, не следует ли активизировать другой процесс, и в случае необходимости
проделывать это. Программы обоих процессов представлены в листинге 1.
#define N 100
int count = 0;
void producer()
{
int item;
while (TRUE) {
item=produce_item(); //сформировать следующий элемент
if (count==N) sleep(); //буфер полон – состояние ожидания
insert_item(item); //поместить элемент в буфер
count++;
if (count==1) wakeup(consumer);
}
}
void consumer()
{
int item;
while (TRUE) {
if (count==0) sleep(); //буфер пуст состояние ожидания
item=remove_item(item); //забрать элемент из буфера
count--;
if (count==N-1) wakeup(producer);
}
}
Листинг 1 Проблема производителя и потребителя с неустранимым
состоянием соревнования
Для описания на языке С системных вызовов sleep и wakeup мы представили
их в виде вызовов библиотечных процедур. В стандартной библиотеке С их нет, но
они будут доступны в любой системе, в которой присутствуют такие системные
вызовы. Процедуры insert_item и remove_item помещают элементы в буфер и
извлекают их оттуда.
Возникновение состояния состязания возможно, поскольку доступ к
переменной count не ограничен. Может возникнуть следующая ситуация: буфер
пуст, и потребитель только что считал значение переменной count, чтобы
проверить, не равно ли оно нулю. В этот момент планировщик передал управление
производителю, производитель поместил элемент в буфер и увеличил значение
count, проверив, что теперь оно стало равно 1. Зная, что перед этим оно было равно
0 и потребитель находился в состоянии ожидания, производитель активизирует его с
помощью вызова wakeup.
помещает данные в буфер и увеличивает значение count.
     Код программы потребителя прост: сначала проверить, не равно ли значение
count нулю. Если равно, то уйти в состояние ожидания; иначе забрать порцию
данных из буфера и уменьшить значение count. Каждый из процессов также должен
проверять, не следует ли активизировать другой процесс, и в случае необходимости
проделывать это. Программы обоих процессов представлены в листинге 1.

#define N 100
int count = 0;

void producer()
{
       int item;
       while (TRUE) {
               item=produce_item();       //сформировать следующий элемент
               if (count==N) sleep();     //буфер полон – состояние ожидания
               insert_item(item);         //поместить элемент в буфер
               count++;
               if (count==1) wakeup(consumer);
       }
}

void consumer()
{
       int item;
       while (TRUE) {
               if (count==0) sleep();    //буфер пуст – состояние ожидания
               item=remove_item(item); //забрать элемент из буфера
               count--;
               if (count==N-1) wakeup(producer);
       }
}
             Листинг 1 – Проблема производителя и потребителя с неустранимым
                              состоянием соревнования

      Для описания на языке С системных вызовов sleep и wakeup мы представили
их в виде вызовов библиотечных процедур. В стандартной библиотеке С их нет, но
они будут доступны в любой системе, в которой присутствуют такие системные
вызовы. Процедуры insert_item и remove_item помещают элементы в буфер и
извлекают их оттуда.
      Возникновение состояния состязания возможно, поскольку доступ к
переменной count не ограничен. Может возникнуть следующая ситуация: буфер
пуст, и потребитель только что считал значение переменной count, чтобы
проверить, не равно ли оно нулю. В этот момент планировщик передал управление
производителю, производитель поместил элемент в буфер и увеличил значение
count, проверив, что теперь оно стало равно 1. Зная, что перед этим оно было равно
0 и потребитель находился в состоянии ожидания, производитель активизирует его с
помощью вызова wakeup.

                                                                                7