Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_OS_pervaya_tret.docx
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
3.1 Mб
Скачать

5) Барьеры

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

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

Примитив barrier()

1

1

2

3

4

4

3

2

Тема 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]);

}

}

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

Решение проблемы читателей и писателей

semaphore mutex = 1;

semaphore db = 1;

int rc = 0;

void writer()

{

while (TRUE)

{

make_data();

down(&db);

write_data();

up(&db);

}

}

void reader() {

while (TRUE) {

down(&mutex);

rc = rc + 1;

if (rc == 1) down(&db);

up(&mutex);

read_data();

down(&mutex);

rc = rc - 1;

if (rc == 0) up(&db);

up(&mutex);

process_data();

}

}

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

Решение проблемы спящего брадобрея

#define CHAIRS 5

semaphore custs = 0;

semaphore barbers = 0;

semaphore mutex = 1;

int wait = 0;

void barber() {

while (TRUE) {

down(&custs);

down(&mutex);

wait = wait - 1;

up(&barbers);

up(&mutex);

cut_hair();

}

}

void customer() {

down(&mutex);

if (wait < CHAIRS) {

wait = wait + 1;

up(&custs);

up(&mutex);

down(&barbers);

get_haircut();

} else {

up(&mutex);

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]