- •Тема 1. Операционные системы
- •Тема 2. История ос
- •0.Аналитическая машина Чарльза Бэббиджа
- •Тема 3. Архитектура ос
- •Тема 4. Процессы и потоки
- •Тема 5. Обработка прерываний
- •Тема 6. Управление процессами и потоками
- •Тема 10.Взаимоблокировки
- •Тема 11.Управление памятью
- •Тема 12.Виртуальная память
- •Тема 13. Стратегии замещения виртуальной памяти
- •Тема 13.Файловые системы
- •Тема 14. Реализация некоторых подсистем ос Windows
- •Ipc (обмен)
- •Ipc (синхронизация)
- •Тема 15. Реализация некоторых подсистем ос Linux
- •Тема 7. Межпроцессное взаимодействие (Inter-Process Communication, ipc)
- •6.2) Аппаратная поддержка (xchg)
- •Тема 8. Примитивы межпроцессного взаимодействия
- •1) Семафоры
- •2) Мьютексы (mutex)
- •3) Мониторы
- •4) Очереди сообщений
- •5) Барьеры
- •Тема 9. Классические проблемы межпроцессного взаимодействия
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);
}
}