Лекція: Синхронізація процесів та потоків
1. Вступ до синхронізації процесів і потоків
У сучасних операційних системах багато завдань виконуються одночасно завдяки багатозадачності і багатопоточності. Однак одночасне виконання процесів і потоків може призвести до конфліктів, наприклад, коли кілька потоків намагаються одночасно змінити спільний ресурс. Для запобігання таким конфліктам застосовують синхронізацію — методи, що забезпечують правильну та безпечну взаємодію між потоками і процесами.
2. Основні поняття та мета синхронізації
Синхронізація — це механізм, який контролює доступ до спільних ресурсів, таких як пам’ять або файлові системи. Основні завдання синхронізації включають:
Запобігання конкурентному доступу до спільних ресурсів.
Підтримка цілісності даних під час одночасного виконання.
Забезпечення послідовності виконання критичних розділів коду.
Критична секція — це частина коду, яка взаємодіє з спільним ресурсом і не може виконуватись паралельно з іншими потоками, що також звертаються до цього ресурсу.
3. Проблеми синхронізації
Ось основні проблеми, які виникають при виконанні процесів або потоків паралельно:
Взаємне виключення — забезпечення, що в будь-який момент часу лише один потік має доступ до критичної секції.
Голодання (Starvation) — ситуація, коли потік не отримує доступу до ресурсу, оскільки інші потоки постійно його блокують.
Гонка даних (Race Condition) — ситуація, коли результат роботи програми залежить від того, який потік першим отримає доступ до ресурсу.
4. Основні примітиви синхронізації
Існують різні примітиви, які операційні системи використовують для синхронізації процесів і потоків.
4.1 М’ютекси (Mutexes)
М’ютекс (від англ. mutual exclusion) — це примітив синхронізації, який використовується для обмеження доступу до критичної секції. Він дозволяє лише одному потоку зайти у критичну секцію, в той час як інші потоки чекають на звільнення м’ютексу.
Приклад застосування:
Коли потік хоче зайти в критичну секцію, він "блокує" м’ютекс.
Інші потоки, що намагаються зайти у цю ж критичну секцію, зупиняються.
Коли потік завершує роботу в критичній секції, він "розблоковує" м’ютекс.
4.2 Семафори
Семафор — це примітив синхронізації, що може мати значення більше ніж 1, що дозволяє обмеженій кількості потоків одночасно заходити в критичну секцію. Існують два типи семафорів:
Двійковий семафор (Binary Semaphore) — діє аналогічно м’ютексу, допускаючи лише один потік.
Лічильний семафор (Counting Semaphore) — дозволяє заданій кількості потоків одночасно мати доступ до ресурсу.
Приклад застосування: Кількість доступів до спільного ресурсу обмежена, наприклад, кількістю підключень до сервера.
4.3 Монітори
Монітор — це примітив, який забезпечує автоматичне управління доступом до критичних секцій. У моніторі кожен метод об’єкта може бути виконаний лише одним потоком одночасно, інші потоки очікують на свою чергу.
5. Проблеми синхронізації: класичні приклади
Проблема обіду п’яти філософів — описує ситуацію, коли кілька потоків (філософів) мають спільний доступ до обмеженого числа ресурсів (виделок). Філософи можуть потрапити в стан "голодання", якщо не розробити чіткі правила для їхньої поведінки.
Проблема виробника-споживача — модель, у якій є два типи потоків: виробник, що створює ресурс, і споживач, який використовує його. Ці потоки мають працювати синхронізовано для уникнення переповнення або спустошення буфера.
6. Механізми запобігання блокуванню і гонці даних
Deadlock (взаємне блокування): Це ситуація, коли кілька потоків блокують один одного в очікуванні звільнення ресурсів.
Алгоритми уникнення deadlock: Для уникнення deadlock застосовуються підходи, що включають уникнення одночасного блокування декількох ресурсів, а також використання тайм-аутів.
7. Приклади синхронізації в різних мовах програмування
У різних мовах програмування реалізовані різні засоби синхронізації. Наприклад:
Java: Синхронізація реалізується через ключове слово synchronized для моніторів та клас ReentrantLock для м’ютексів.
Python: Для синхронізації використовуються бібліотеки threading та multiprocessing, що включають м’ютекси, семафори та інші примітиви.
C++: Використовується стандартна бібліотека потоків (std::mutex, std::condition_variable).
8. Висновок
Синхронізація є ключовим аспектом управління процесами та потоками в багатозадачних системах. Правильне використання примітивів синхронізації дозволяє ефективно управляти доступом до спільних ресурсів, забезпечуючи цілісність даних і запобігаючи конфліктам між потоками. Вибір конкретного примітиву залежить від конкретних завдань і особливостей операційної системи.
Питання вихідного контролю
Що таке синхронізація процесів і потоків? Чому вона важлива?
Поясніть поняття критичної секції та взаємного виключення.
Як працює м’ютекс і для чого він використовується?
Яка різниця між двійковим та лічильним семафором?
Опишіть проблему обіду п’яти філософів і її зв’язок із синхронізацією.
Що таке Deadlock? Як уникнути взаємного блокування?
У яких випадках доцільно використовувати монітор як примітив синхронізації?
Наведіть приклад синхронізації в будь-якій мові програмування.













