Важливим поняттям синхронізації потоків є поняття «критичної секції» програми. Критична секція - частина програми, результат виконання якої може непередбачувано змінюватися, якщо загальні дані змінюються іншими потоками в той час, коли виконання цієї частини ще не завершено. Критична секція завжди визначається по відношенню до певних критичних даними, при неузгоджену зміні яких можуть виникнути небажані ефекти. У всіх потоках, які працюють з критичними даними, повинна бути визначена критична секція. У різних потоках критична секція складається в загальному випадку з різних послідовностей команд.
32) Поясніть суть використання блокуючих змінних.
Для синхронізації потоків, програміст може використовувати глобальні блокують змінні. З цими змінними, до яких все потоки процесу мають прямий доступ, програміст працює, не звертаючись до системних викликів.
Кожному набору критичних даних, ставиться у відповідність двоичная змінна, якій потік привласнює значення 0, коли він входить в критичну секцію і значення 1, коли він її залишає. Блокують змінні можуть використовуватися не тільки при доступі до даних, але і до ресурсів будь-якого виду. При блокуючих змінних є обмеження на переривання: не можна переривати потік виконанням операції перевірки і встановленням блокує змінної.
Реалізація взаємного виключення, способом блокуючих змінних, має істотний недолік, а саме протягом часу, коли один потік знаходиться в критичній секції, інший потік, якому потрібно цей же ресурс отримавши доступ до процесора, буде безупинно опитувати блокує змінну, марно витрачаючи свій квант часу .
33) Поясніть суть використання семафорів.
Для синхронізації процесів, а точніше, для синхронізації доступу декількох процесів до ресурсів, використовуються семафори. Будучи однією з форм IPC, семафори не призначені для обміну великими обсягами даних, як у випадку FIFO або черг повідомлень. Замість цього, вони виконують функцію, яка повністю відповідає своїй назві - дозволяти або забороняти процесу використання того чи іншого ресурсу,.
Застосування семафорів пояснимо на простому прикладі. Припустимо, є якийсь розділяється ресурс (наприклад, файл). Необхідно блокувати доступ до ресурсу для інших процесів, коли якийсь процес виробляє операцію над ресурсом (наприклад, записує в файл). Для цього зв'яжемо з даними ресурсом якусь целочисленную величину - лічильник, доступний для всіх процесів. Приймемо, що значення 1 лічильника означає доступність ресурсу, 0 - його відсутність. Тоді перед початком роботи з ресурсом процес повинен перевірити значення лічильника. Якщо воно дорівнює 0 - ресурс зайнятий і операція недопустима - процесу залишається чекати. Якщо значення лічильника дорівнює 1 - можна працювати з ресурсом. Для цього, перш за все, необхідно заблокувати ресурс, т. Е. Змінити значення лічильника на 0. Після виконання операції для звільнення ресурсу значення лічильника необхідно змінити на 1. У наведеному прикладі лічильник грає роль семафора.