Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операційні системи.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6.41 Mб
Скачать

Рішення за допомогою семафорів завдання "читачі - письменники"

Суть завдання читачі-письменники в наступному: є загальний ресурс і дві групи процесів: читачі (які можуть тільки читати ресурс, але не змінюють його) і письменники (які змінюють ресурс). У кожен момент працювати з ресурсом може відразу трохи читачів (коли ресурс не змінюється письменниками), але не більше одного письменника. Необхідно синхронізувати їхньої дії над ресурсом і забезпечити взаємне виключення відповідних критичних секцій.

Рішення за допомогою семафорів завдання " філософи, що обідають,"

Суть завдання філософи, що обідають, у наступному. Є круглий стіл, за яким сидять п'ять філософів (втім, їхнє число принципового значення не має – для іншого числа філософів рішення буде аналогічним). Перед кожним з них лежить тарілка з їжею, ліворуч і праворуч від кожного – дві китайські палички. Філософ може перебувати в трьох станах: голоду, думати й обідати. На голодний шлунок філософ думати не може. Але почати обідати він може, тільки якщо обидві палички ліворуч і праворуч від нього вільні. Потрібно синхронізувати дії філософів. У цьому випадку загальним ресурсом є палички. Ілюстрацією умов завдання є рис. 12.1.

Рис. 12.1.  Завдання " філософи, щообідають,".

Критичні області

Критичні області (critical regions) – більше високоринева й надійна конструкція для синхронізації, чим семафори. Загальний ресурс описується у вигляді особливого опису змінної:

v: shared T

Доступ до змінного v можливий тільки за допомогою спеціальної конструкції:

region v when B do S

де v - загальний ресурс; B - булева умова, S - оператор (утримуючий дії над v ).

Семантика даної конструкції наступна. Поки B хибний, процес, її виконуючий, повинен чекати. Коли B стає щирим, процес одержує доступ до ресурсу v і виконує над ним операції S. Поки виконується оператор S, більше жоден процес не має доступу до змінного v.

Рішення за допомогою критичних областей завдання "обмежений буфер"

Опишемо буфер як структуру:

struct buffer {

int pool [n];

int count, in, out

}

buf: shared buffer;

Алгоритм процесу-виробника:

region buf when (count < n) {

pool [in] = nextp;

in = (in+1) % n;

count++;

}

Помітимо, що перевірка переповнення буфера виконується при вході в конструкцію region, і споживач чекає, поки в буфері звільниться хоча б один елемент.

Алгоритм процесу-споживача:

region buf when (count > 0) {

nextc = pool [out];

out = (out+1) % n;

count-і;

}

Не можна не відзначити, наскільки простіше й надійніше виявляється рішення завдання з використанням даної конструкції, у порівнянні з використанням семафорів.

Схема реалізації критичних областей за допомогою семафорів

Будемо використати для реалізації конструкції region x when B do S наступні семафори й цілі змінні:

semaphore mutex, first-delay, second-delay;

int first-count, second-count;

Семафор mutex використається для взаємно виключення доступу до критичної секції S. Семафор first-delay використається для очікування процесів, які не можуть увійти в критичну секцію S, тому що умова B хибна. Число таких процесів зберігається в змінної first-count. Семафор second-delay використається для очікування тих процесів, які обчислили умову B один раз й очікують, коли їм буде дозволено повторно обчислити B ( second-count - лічильник таких процесів).