Примитивы межпроцессного взаимодействия

Sleep()-блокирует текущий процесс

Wakeup(процесс)-разблокирует заданный процесс

Задача: производителя и потребителя:

Производитель:

 

Потребитель:

Задача: Семафор:

Семафор- некоторая целочисленная переменная над которой определены 2 операции:

P -операция (down())- если значение семафора равно 0, вызвавши процесс блокируется, иначе значение уменьшается на 1, а вызвавший процесс продолжается.

V-операция (up())-если на семафоре имеются заблокированные процессы, то один из них запускается, иначе значение семафора увеличивается на 1.

Любая операция с семафором исполняется как единое непрерывное (атомарное) действие. По этому операции с семафором реализуются с помощью системных вызовов.

Семафор mntex

Down(& mutex);

Критический область

Up(0 mutex)

Пример на Си:

#define N=100

Typedef int semaphore;

Semaphore mutex=1;

Semaphore empty=N

Semaphore empty=0

Void producer(void)

{

Int item;

While(1){

Item=producer.item();

Down(& empty);

Down(& mutex);

put_data(item);

up(& mutex);

up(& ful);

}

}

 

Void consumer(void)

{

Int item;

While(1){

Dawn(& full);

Down(& mutex);

Intem=get_dta()

Up(& mutex);

Up(& emptu);

}