Процес Syncхронізація: проблема критичного розділу в ОС
⚡ Розумний підсумок
Процес SyncХронізація — це завдання координації виконання процесів таким чином, щоб жодні два процеси не мали одночасного доступу до одних і тих самих спільних даних або ресурсів. Вона запобігає неузгодженості даних у багатопроцесорних системах, контролюючи вхід до критичної секції.

Що таке процес Syncхронізація?
Процес Syncхронізація Це завдання координації виконання процесів таким чином, щоб жодні процеси не мали доступу до однакових спільних даних і ресурсів.
Це особливо необхідно в багатопроцесній системі, коли кілька процесів працюють одночасно, і більше одного процесу намагається отримати доступ до одного й того ж спільного ресурсу або даних одночасно.
Це може призвести до неузгодженості спільних даних. Тому зміни, внесені одним процесом, не обов'язково відображаються, коли інші процеси отримують доступ до тих самих спільних даних. Щоб уникнути такої неузгодженості даних, процеси необхідно синхронізувати один з одним.
Як обробляти Syncхронізація працює?
Наприклад, процес A змінює дані в області пам'яті, поки інший процес B намагається зчитати ці дані звідти. то ж розташування пам'яті. Існує висока ймовірність того, що дані, зчитані другим процесом, будуть помилковими.
Розділи програми
Ось чотири основні елементи критичного розділу:
- Розділ входу: Це частина процесу, яка вирішує вступ до певного процесу.
- Критичний розділ: Ця частина дозволяє одному процесу вводити та змінювати спільну змінну.
- Вихід з розділу: Розділ «Вихід» дозволяє іншим процесам, що очікують у розділі «Вхід», увійти до критичного розділу. Він також перевіряє, чи слід видалити процес, який завершив своє виконання, через цей розділ.
- Залишок розділу: Всі інші частини Code, які не знаходяться в критичній секції, секції входу та секції виходу, відомі як секція залишків.
Що таке проблема критичної ділянки?
Критична секція — це сегмент коду, до якого може отримати доступ один процес у певний момент часу. Ця секція складається зі спільних ресурсів даних, до яких мають отримати доступ інші процеси.
- Вхід до критичної секції обробляється функцією wait(), і вона представлена як P().
- Вихід із критичної секції контролюється функцією signal(), представленою як V().
У критичній секції може бути виконано лише один процес. Інші процеси, які очікують на виконання свого критичного розділу, повинні дочекатися, поки поточний процес завершить своє виконання.
Правила для критичної секції
Критична секція повинна дотримуватися всіх трьох правил:
- Взаємне виключення: Взаємне виключення — це особливий тип двійкового семафора, який використовується для контролю доступу до спільного ресурсу. Він включає механізм успадкування пріоритетів, щоб уникнути розширених проблем інверсії пріоритетів. Одночасно в його критичній секції може виконуватися не більше одного процесу.
- прогрес: Це рішення використовується, коли нікого немає в критичній секції, і хтось хоче до неї долучитися. Тоді ці процеси, які не знаходяться в секції залишків, повинні вирішити, хто повинен до неї долучитися, за скінченний час.
- Прив'язане очікування: Коли процес робить запит на доступ до критичної секції, існує певне обмеження щодо кількості процесів, які можуть потрапити до його критичної секції. Тому, коли ліміт досягнуто, система повинна дозволити запит до процесу потрапити до його критичної секції.
Рішення для критичного розділу
В процесі Syncхронізація, критичний розділ відіграє головну роль, тому проблему необхідно вирішити.
Ось кілька широко використовуваних методів вирішення проблеми критичного перетину.
Рішення Петерсона
Розв'язок Петерсона є широко використовуваним розв'язком задач критичного перерізу. Цей алгоритм був розроблений вченим-інформатиком на ім'я Петерсон, тому він і називається розв'язком Петерсона.
У цьому рішенні, коли процес виконується в критичному стані, інший процес виконує лише решту коду, і може статися навпаки. Цей метод також допомагає переконатися, що в критичному розділі в певний час виконується лише один процес.
Приклад
PROCESS Pi
FLAG[i] = true
while( (turn != i) AND (CS is !free) ){ wait;
}
CRITICAL SECTION FLAG[i] = false
turn = j; //choose another process to go to CS
- Припустимо, що існує N процесів (P1, P2, … PN), і кожен процес у певний момент часу повинен потрапити в критичну секцію.
- Підтримується масив FLAG[] розміром N, який за замовчуванням має значення false. Отже, щоразу, коли процес потребує входу в критичну секцію, він повинен встановити свій прапорець як true. Наприклад, якщо Pi хоче туди ввійти, він встановить FLAG[i]=TRUE.
- Інша змінна під назвою TURN вказує номер процесу, який наразі очікує на введення в CS.
- Процес, який увійде в критичний розділ під час виходу, змінить TURN на інший номер зі списку готових процесів.
- Приклад: хід дорівнює 2, потім P2 входить у критичну секцію, і під час виходу хід=3, а отже, P3 виходить з циклу очікування.
Syncхронізація обладнання
Іноді проблеми Критичної секції також вирішуються апаратним забезпеченням. Деякі операційні системи пропонують функцію блокування, коли Процес отримує блокування при вході до Критичної секції та знімає блокування після виходу з неї.
Отже, коли інший процес намагається увійти в критичний розділ, він не зможе увійти, оскільки він заблокований. Він може зробити це, лише якщо він вільний, отримавши сам замок.
Блокування Mutex
SyncАпаратна хронізація — це метод, який не кожен може легко реалізувати, тому було також запроваджено суворий програмний метод, відомий як Mutex Locks.
У цьому підході в секції входу коду отримується LOCK для критичних ресурсів, що використовуються всередині критичної секції. У секції виходу цей замок знімається.
Semaphore Рішення
Semaphore — це просто змінна, яка є невід'ємною та використовується спільно між потоками. Це ще один алгоритм або рішення проблеми критичної секції. Це механізм сигналізації, і потік, який очікує на семафор, може бути сигналізований іншим потоком.
Він використовує дві атомарні операції: 1) очікування та 2) сигнал для синхронізації процесу.
Приклад
WAIT ( S ): while ( S <= 0 ); S = S - 1; SIGNAL ( S ): S = S + 1;


