обчислювальної системи, наприклад реакції на натискання комбінації клавіш Сtгl + С. Щомиті в системі відбуваються сотні подій, пов'язаних з розподілом і звільненням ресурсів, і операційна система повинна мати надійні і продуктивні засоби, які б дозволяли їй синхронізувати потоки з відбуваються в системі подіями.
Для синхронізації потоків прикладних програм програміст може використовувати як власні кошти і прийоми синхронізації, так і засоби операційної системи. Наприклад, два потоки одного прикладного процесу можуть координувати свою роботу з допомогою доступною для них обох глобальної логічної змінної, яка встановлюється в одиницю при здійсненні деякої події, наприклад вироблення одним потоком даних, потрібних для продовження роботи іншого. Однак у багатьох випадках більш ефективними або навіть єдино можливими є кошти синхронізації, що надаються операційною системою у формі системних викликів.
Так, потоки, що належать різним процесам, не мають можливості втручатися будь-яким чином в роботу один одного. Без посередництва операційної системи вони не можуть призупинити один одного або оповістити про подію. Засоби синхронізації використовуються операційною системою не лише для синхронізації прикладних процесів, а й для її внутрішніх потреб. Зазвичай розробники операційних систем надають у розпорядження прикладних і системних програмістів широкий спектр засобів синхронізації. Ці кошти можуть утворювати ієрархію, коли на основі більш простих засобів будуються більш складні, бути функціонально спеціалізованими. Наприклад, кошти для синхронізації потоків одного процесу, засоби для синхронізації потоків різних процесів при обміні даними і т. Д. Часто функціональні можливості різних системних викликів синхронізації перекриваються, так що для вирішення однієї задачі програміст може скористатися кількома викликами в залежності від своїх особистих переваг. Нехтування питаннями синхронізації в многопоточной системі може призвести до неправильного вирішення задачі або навіть до краху системи. 2. Критичні секції Важливим поняттям синхронізації потоків є поняття «критичної секції» програми.
Критична секція - це частина програми, результат виконання якої може непередбачувано змінюватися, якщо змінні, що відносяться до цієї частини програми, змінюються іншими потоками в той час, коли виконання цієї частини ще не завершено. Критична секція завжди визначається по відношенню до певних критичним даними , при неузгодженому зміні яких можуть виникнути небажані ефекти. У всіх потоках, що працюють з критичними даними, повинна бути визначена критична секція. У різних потоках критична секція складається в загальному випадку з різних послідовностей команд. Щоб виключити ефект гонок по відношенню до критичних даними, необхідно забезпечити, щоб у кожен момент часу в критичній секції, пов'язаної з цими даними, знаходився тільки один потік. При цьому неважливо, знаходиться цей потік в активному або в загальмованому стані. Цей прийом називають взаємним винятком . Операційна система використовує різні способи реалізації взаємного виключення. Деякі способи придатні для взаємного виключення при входженні в критичну секцію тільки потоків одного процесу, в той час як інші можуть забезпечити взаємне виключення і для потоків різних процесів. Найпростіший і в той же час самий неефективний спосіб забезпечення взаємного виключення полягає в тому, що операційна система дозволяє потоку забороняти будь переривання на час його перебування в критичній секції. Однак цей спосіб практично не застосовується, так як небезпечно довіряти управління системою користувацькому потоку - він може надовго зайняти процесор, а при краху потоку в критичній секції крах потерпить вся система, тому що переривання ніколи не будуть дозволені.
Блокуючі змінні . Для синхронізації потоків одного процесу прикладний програміст може використовувати глобальні блокуючі змінні . З цими змінними, до яких всі потоки процесу мають прямий доступ, програміст працює, не звертаючись до системних викликів ОС.
Кожному набору критичних даних ставиться у відповідність двійкова змінна, якій потік привласнює значення 0, коли він входить в критичну секцію, і значення 1, коли він її залишає. Блокуючі змінні можуть використовуватися не тільки при доступі до даних, що розділяються, а й при доступі до ресурсів, що розділяються будь-якого виду. Якщо всі потоки написані з урахуванням вищеописаних угод, то взаємне виключення гарантується. При цьому потоки можуть бути перервані операційною системою в будь-який момент і в будь-якому місці, у тому числі в критичній секції.
Однак слід зауважити, що одне обмеження на переривання усе ж є. Не можна переривати потік м...