
3. Паралельно процесу і критичні ділянки
Робоча суміш, створена механізмами вищої та внутрішнього планування, являє собою сукупність паралельних процесів.
Процеси називаються паралельними, якщо вони існують у системі одночасно.
Паралельні процеси називаються незалежними, якщо вони працюють без цілеспрямованої передачі сигналів інформації один одному.Паралельні процеси називаються пов'язаними, якщо здійснюється спрямований обмін сигналами (інформацією) між ними.Пов'язані паралельні процеси бувають синхронними, коли забезпечуються узгодження швидкостей їх розвитку в системі, і асинхронними, якщо швидкості протікання процесів не регулюються в системі.У механізмах синхронізації потребують всі види паралельних процесів, що функціонують в мультипрограмній обчислювальній системі.
Не зв'язані між собою процеси також потребують синхронізації своєї роботи. Це пояснюється тим, що вони
використовують під час функціонування одні й ті ж фізичні і логічні зовнішні пристрої, які в кожен
конкретний момент часу можуть обслуговувати тільки один процес (критичні ресурси).
Ресурс системи називається критичним, якщо він допускає в кожен момент часу обслуговування тільки одного процесу.Загальним принципом, покладеним в основу всіх механізмів синхронізації процесів, є принцип взаємовиключення.
Принцип взаємовиключення: кожен процес, що звертає до поділюваних (критичним) ресурсів, повинен ви-
чить можливість для всіх інших процесів одночасного з ним використання цього ресурсу.
Використання принципу взаимоисключения вимагає вбудовування в програми процесів механізмів синхронізації,
забезпечують виконання наступних умов:
• при зверненні декількох процесів до одного ресурсу, що тільки одному з них дозволено скористатися
цим ресурсом;
• в кожен момент часу тільки один процес повинен володіти критичним ресурсом.
Всі механізми синхронізації, реалізують принцип взаємовиключення, засновані на застосуванні концепції критичного ділянки програми.
Критичним ділянкою, критичною областю програми процесу називається той відрізок програмного коду
процесу, на якому цей процес утворюється до критичного ресурсу.Кількість критичних ділянок у процесі залежить тільки від того, до ресурсів якого виду він звертається при своєму функціонуванні.
Коли певний процес знаходиться на своїй критичному ділянці, інші процеси можуть продовжувати виконання, але без входу в їх критичні ділянки (зайнятим критичним ресурсам), коли процес виходить з критичного ділянки, то повинно бути дозволено використання звільненого критичного ресурсу. Забезпечення взаимоисключения є основною проблемою паралельного програмування.
4.Механізми синхронізації процесів
Критична секція Важливим поняттям синхронізації процесів є поняття "критична секція" програми. Критична секція - це частина програми, в якій здійснюється доступ до даних, що розділяються. Щоб виключити ефект гонок по відношенню до деякого ресурсу, необхідно забезпечити, щоб у кожен момент в критичній секції, зв'язаної з цим ресурсом, перебував максимум один процес. Цей прийом називають взаємним виключенням. Найпростіший спосіб забезпечити взаємне виключення - дозволити процесу, що знаходиться в критичній секції, забороняти все переривання. Однак цей спосіб не годиться, тому що небезпечно довіряти управління системою для користувача процесу, він може надовго зайняти процесор, а при краху процесу в критичній області крах потерпить вся система, тому що переривання ніколи не будуть дозволені. Іншим способом є використання блокуючих змінних. З кожним ресурсом зв'язується двійкова змінна, яка приймає значення 1, якщо ресурс вільний (тобто ні один процес не знаходиться в даний момент в критичній секції, пов'язаною з цим процесом), і значення 0, якщо ресурс зайнятий. На малюнку 2.4 показаний фрагмент алгоритму процесу, що використовує для реалізації взаємного виключення доступу до ресурсу D блокує змінну F (D). Перед входом в критичну секцію процес перевіряє, чи вільний ресурс D. Якщо він зайнятий, то перевірка циклічно повторюється, якщо вільний, то значення змінної F (D) встановлюється в 0, і процес входить в критичну секцію. Після того, як процес виконає всі дії з ресурсом D, значення змінної F (D) знову встановлюється рівним 1. Рис. 2.4. Реалізація критичних секцій з використанням блокуючих змінних Якщо всі процеси написані з використанням вищеописаних угод, то взаємне виключення гарантується. Слід зауважити, що операція перевірки та встановлення блокує змінної повинна бути неподільною. Пояснимо це. Нехай у результаті перевірки змінної процес визначив, що ресурс вільний, але відразу після цього, не встигнувши встановити змінну в 0, був перерваний. За час його призупинення інший процес зайняв ресурс, увійшов у свою критичну секцію, але також був перерваний, не завершивши роботи з ресурсом. Коли управління було повернуто перший процесу, він, вважаючи ресурс вільним, встановив ознака зайнятості і почав виконувати свою критичну секцію. Таким чином був порушений принцип взаємного виключення, що потенційно може призвести до небажаних наслідків. Щоб уникнути таких ситуацій у системі команд машини бажано мати єдину команду "перевірка-установка", або ж реалізовувати системними засобами відповідні програмні примітиви, які б забороняли переривання протягом всієї операції перевірки та встановлення. Реалізація критичних секцій з використанням блокуючих змінних має істотний недолік: протягом часу, коли один процес знаходиться в критичній секції, інший процес, якому потрібен той же ресурс, буде виконувати рутинні дії за опитуванням блокує змінної, марно витрачаючи процесорний час. Для усунення таких ситуацій може бути використаний так званий апарат подій. За допомогою цього засобу можуть вирішуватися не тільки проблеми взаємного виключення, але й більш загальні завдання синхронізації процесів. У різних операційних системах апарат подій реалізується по своєму, але в будь-якому випадку використовуються системні функції аналогічного призначення, які умовно назвемо WAIT (x) і POST (x), де x - ідентифікатор деякої події. На малюнку 2.5 показаний фрагмент алгоритму процесу, що використовує ці функції. Якщо ресурс зайнятий, то процес не виконує циклічний опитування, а викликає системну функцію WAIT (D), тут D позначає подія, що полягає у звільненні ресурсу D. Функція WAIT (D) переводить активний процес в стан ОЧІКУВАННЯ і робить відмітку в його дескрипторі про те, що процес чекає події D. Процес, який в цей час використовує ресурс D, після виходу з критичної секції виконує системну функцію POST (D), в результаті чого операційна система переглядає чергу очікують процесів і переводить процес, що очікує події D, в стан ГОТОВНІСТЬ.