Лекція: Критичні секції та проблема взаємного виключення
Вступ
У сучасних операційних системах і багатозадачних середовищах кілька процесів або потоків часто виконуються одночасно. Вони можуть спільно використовувати ресурси, наприклад, файли, пам'ять, змінні, що створює ризик конфліктів і непередбачуваних результатів. Ця ситуація породжує потребу в управлінні доступом до спільних ресурсів, щоб уникнути небажаних ефектів і забезпечити коректне виконання програм. Одним з найважливіших понять для вирішення цієї проблеми є критична секція та взаємне виключення. У цій лекції ми детально розглянемо ці поняття, їх важливість і способи реалізації.
1. Що таке критична секція?
1.1. Визначення
Критична секція — це частина коду, яка має доступ до спільного ресурсу, наприклад, до змінної або файлу, і яку не можна виконувати одночасно декількома процесами або потоками. Тобто, якщо один процес виконує код у критичній секції, жоден інший процес не повинен мати доступ до цього ресурсу в цей час.
2. Проблема взаємного виключення
2.1. Визначення
Взаємне виключення — це властивість системи, яка гарантує, що одночасно лише один процес або потік може виконувати код у критичній секції. Це дозволяє уникнути конфліктів при доступі до спільних ресурсів.
2.2. Умови взаємного виключення
Для коректного вирішення проблеми взаємного виключення необхідно виконати наступні умови:
Взаємне виключення: одночасно тільки один процес може виконувати код у критичній секції.
Прогрес: якщо жоден процес не знаходиться в критичній секції, інші процеси не повинні марно чекати.
Обмежене очікування: жоден процес не повинен чекати нескінченно, щоб потрапити в критичну секцію.
Відсутність передбачення: доступ до критичної секції не залежить від стану інших процесів.
3. Способи реалізації взаємного виключення
Існує кілька підходів до реалізації взаємного виключення в операційних системах. Розглянемо найпоширеніші методи.
3.1. Використання блокувань (Locks)
Блокування — це один із найпростіших способів забезпечити взаємне виключення. Він передбачає встановлення "замку" перед входом у критичну секцію і зняття цього замку після виходу.
Мютекси (Mutex): використовуються для взаємного виключення між потоками. Якщо потік захоплює мютекс, інші потоки повинні чекати, поки мютекс не буде звільнений.
3.2. Використання семафорів (Semaphores)
Семафори — це більш універсальний механізм синхронізації, який може використовуватися як для взаємного виключення, так і для інших завдань, наприклад, контролю доступу до обмежених ресурсів.
Бінарний семафор: працює як мютекс (приймає значення 0 або 1).
Лічильний семафор: дозволяє одночасний доступ декількох процесів (лічильник визначає кількість дозволених доступів).
3.3. Алгоритм Деккера
Алгоритм Деккера — це один із перших програмних методів вирішення проблеми взаємного виключення. Він не потребує спеціального апаратного забезпечення.
Використовує змінні для індикації, чи хоче процес увійти в критичну секцію.
Забезпечує, що лише один процес буде виконувати код у критичній секції.
3.4. Алгоритм Петерсона
Цей алгоритм є вдосконаленням алгоритму Деккера і гарантує взаємне виключення за допомогою двох змінних: однієї для перевірки намірів процесу, іншої для вказівки черговості.
4. Проблеми синхронізації
При розробці систем, що використовують механізми взаємного виключення, можуть виникати різні проблеми:
Гонки (Race Conditions): коли результат роботи системи залежить від того, який процес отримав доступ до ресурсу першим.
Взаємне блокування (Deadlock): коли два або більше процесів чекають один на одного, щоб звільнити ресурс.
Голодання (Starvation): процес не отримує доступу до критичної секції через інші процеси з вищим пріоритетом.
Завищене використання процесора (Busy Waiting): процес використовує процесорний час в очікуванні доступу до критичної секції.
5. Приклади використання критичних секцій
Критичні секції широко використовуються в різних сферах:
Бази даних: для запобігання одночасному оновленню записів кількома користувачами.
Файлові системи: для захисту від одночасного доступу до файлів.
Мережева передача даних: для забезпечення коректності переданої інформації.
Висновок
Критичні секції та проблема взаємного виключення є ключовими аспектами багатозадачних операційних систем. Розуміння цих концепцій дозволяє ефективно управляти доступом до спільних ресурсів, запобігати помилкам і підвищувати надійність програмного забезпечення. Вирішення проблеми взаємного виключення вимагає використання різних алгоритмів і методів, таких як мютекси, семафори та інші механізми синхронізації.
Питання для вихідного контролю
Що таке критична секція?
У чому полягає проблема взаємного виключення?
Які умови необхідно виконати для досягнення взаємного виключення?
Що таке мютекс і як він використовується для вирішення проблеми взаємного виключення?
Поясніть різницю між бінарним і лічильним семафором.
Як працює алгоритм Петерсона?
Що таке гонки і як їх уникнути?
У яких випадках виникає взаємне блокування?
Як можна вирішити проблему завищеного використання процесора при очікуванні доступу до критичної секції?
Наведіть приклад реального використання критичних секцій.













