Главная Обратная связь

Дисциплины:






Решение ППП с помощью очередей сообщений



#define N 100

void producer(void)

{

int item;

msg m;

while (TRUE) {

item = produce_item();

receive(consumer, &m);

build_msg(&m, item);

send(consumer, &m);

};

}

void consumer(void)

{

int item;

msg m;

for (int i=0; i<N; i++)

send(producer, &m);

while (TRUE) {

receive(producer, &msg);

item = extract_item(&m);

send(producer, &m);

consume_item(item);

};

}

Барьеры

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

Часто применяется в распределённых системах и в файловых системах

Примитив barrier()

 

Тема 9. Классические проблемы межпроцессного взаимодействия

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

Проблема обедающих философов

Проблема читателей и писателей

Проблема спящего брадобрея

Проблема обедающих философов

#define N 5

void philosopher(int i) {

while (TRUE) {

think();

take_fork(i);

take_fork((i+1) % N);

eat();

put_fork(i);

put_fork((i+1) % N);

}

}

Решение проблемы обедающих философов

#define N 5

#define LEFT (i+N-1) % N

#define RIGHT (i+1) % N

#define THINKING 0

#define HUNGRY 1

#define EATING 2

int state[N];

semaphore mutex = 1;

semaphore s[N];

void take_forks(int i) {

down(&mutex);

state[i] = HUNGRY;

test(i);

up(&mutex);

down(&s[i]);

}

void philosopher(int i) {

while (TRUE)

think();

take_forks(i);

eat();

put_forks();

}

}

void put_forks(int i) {

down(&mutex);

state[i] = THINKING;

test(LEFT);

test(RIGHT);

up(&mutex);

}

void test(i)

{

if (state[i] == HUNGRY &&

state[LEFT] != EATING &&

state[RIGHT] != EATING)

{

up(&s[i]);

}

}

Проблема читателей и писателей





sdamzavas.net - 2020 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...