
- •Процеси та потоки Процеси
- •Модель процесу
- •Створення процесу
- •Завершення процесу
- •Ієрархія процесів
- •Стани процесу
- •Реалізація процесу
- •Класична модель потоків
- •Реалізація потоків в просторі користувача
- •Реалізація потоків в просторі ядра
- •Активація планувальника
- •Спливаючі потоки
- •Взаємодія процесів
- •Змагання між процесами
- •Критична секція
- •Блокуючі змінні
- •Строге чергування
- •Алгоритм Петерсона
- •Команда tsl
- •Завдання виробника і споживача. Sleep і wakeup.
- •Семафори
- •М’ютекси
- •Монітори
- •Завдання алгоритму планування
Критична секція
Для вирішення проблеми змагань між процесами потрібен спосіб взаємного виключення, тобто спосіб, що забезпечує правило, при якому, якщо загальні дані або файл використовуються одним процесом, можливість їх використання всіма іншими процесами виключається.
Та частина програми, в якій використовується доступ до загальної пам'яті, називається критичною областю або критичною секцією. Якби вдалося все вибудувати таким чином, щоб ніякі два процеси не знаходились одночасно у своїх критичних областях, це дозволило б уникнути змагань.
Для прийнятного рішення необхідне дотримання чотирьох умов:
1. Два процеси не можуть одночасно перебувати у своїх критичних областях.
2. Не повинні вибудовуватися ніякі припущення з приводу швидкості або кількості центральних процесорів.
3. Ніякі процеси, що виконуються за межами своїх критичних областей, не можуть блокуватися іншими процесами.
4. Процеси не повинні знаходитися у вічному очікуванні входу в свої критичні області.
Синхронізація процесів та потоків
Ключовим питанням синхронізації процесів є досягнення режиму взаємного виключення, при якому поки один процес зайнятий оновленням спільної пам'яті і перебуває у своїй критичній області, ніякий інший процес не зможе увійти в свою критичну область і створити проблему.
Заборона переривань
У однопроцесорних системах найпростішим рішенням є заборона всіх переривань кожним процесом відразу після входу в критичну область і їх дозвіл відразу ж після виходу з критичної області. Оскільки процес заборонив переривання, то процесор не зможе переключитись на інший процес, а отже діючий процес може досліджувати і оновляти загальну пам'ять, не побоюючись втручання з боку будь-якого іншого процесу.
Проте таке рішення має декілька слабких місць:
-
Який-небудь процес може вимкнути, а після виходу з критичної секції не ввімкнути переривання. Це може викликати крах всієї системи.
-
Окрім цього, якщо ми маємо справу в багатопроцесорній системі заборона переривань діє тільки на той центральний процесор, на якому виконується заборонна інструкція. Всі інші процесори продовжать свою роботу і зможуть звертатися до загальної пам'яті.
Проте заборона переривань є корисною технологією всередині самої операційної системи, так заборона переривань всього на декілька інструкцій найчастіше є дуже зручним засобом для самого ядра, коли воно оновлює змінні або списки.
Блокуючі змінні
Іншим способом є використання загальної (блокуючої) змінної, початкове значення якої дорівнює нулю. Коли процесу потрібно увійти в свою критичну область, спочатку він перевіряє значення блокуючої змінної. Якщо воно дорівнює 0, процес встановлює його в 1 і входить в критичну область. Якщо значення вже дорівнює 1, процес просто чекає, поки воно не стане дорівнює нулю. Таким чином, нульове значення означає, що жоден з процесів не перебуває у своїй критичній області, а одиниця означає, що якийсь процес перебуває у своїй критичній області.
Мроте ця модель має ту саму вразливість, яку ми вже бачили на прикладі з каталогом спулера. Припустимо, що один процес зчитує значення блокуючої змінної і бачить, що воно дорівнює нулю. Перед тим як він зможе встановити значення в одиницю, планувальник запускає інший процес, який встановлює значення в одиницю. Коли поновлюється виконання першого процесу, він також встановить значення блокуючої змінної в одиницю, і два процеси одночасно опиняться в своїх критичних областях.