- •Урок № 61
- •Урок № 62
- •Урок № 72
- •Урок № 73
- •Створення зв'язку з файлом /dev/modem за допомогою команди lisa.
- •Настройка системи Linux для встановлення зв'язку.
- •Як створюється зв'язок з файлом /dev/modem за допомогою команди lisa?
- •Яким чином можна настроїти систему Linux для встановлення зв'язку?
- •Урок № 74
- •Урок № 75
- •Використання програми mail.
- •Урок № 76
- •Використання клієнта kpackage
- •Як використовується клієнт kpackage?
- •Урок № 77
- •Урок № 80
- •Урок № 82
- •Урок № 84
- •Урок № 85
- •Урок № 86
- •Урок № 87
- •Урок № 88
- •Урок № 89
- •Урок № 90
- •Урок № 92
- •Урок № 93
- •Урок № 95
- •Урок № 96
- •Урок № 97
- •Урок № 97
Урок № 97
(згідно навчальної робочої програми)
Тема: «Взаємодія потоків у Windows ХР»
Питання:
Механізми синхронізації потоків ОС.
Синхронізація у виконавчій системі.
Очікування на диспетчерських об’єктах.
Структури даних синхронізації.
Програмний інтерфейс взаємодії Win32 АРІ. Функції очікування.
М’ютекси Win32 АРІ.
Механізми синхронізації потоків ОС
Механізми синхронізації потоків у Windows ХР реалізовані на трьох рівнях: синхронізація в ядрі (на рівні потоків ядра), виконавчій системі та в режимі користувача у підсистемі Win32.
Основними механізмами синхронізації ядра Windows ХР є спін-блокування. Перед тим як почати роботу зі спільно використовуваними даними, потік ядра має отримати таке блокування, можливо, шляхом активного очікування.
Синхронізація у виконавчій системі
Код виконавчої системи теж може користуватися спін-блокуваннями, але вони пов'язані з активним очікуванням і їхнє застосування обмежується лише організацією взаємного виключення впродовж короткого часу. Складніші задачі синхронізації розв’язують за допомогою диспетчерських об’єктів(dispatcher objects) і ресурсів виконавчої системи(executive resources).
Диспетчерські об’єкти — це об’єкти виконавчої системи, що можуть бути ви- ористані разом із сервісами очікування менеджера об’єктів.
Ресурси виконавчої системи можуть бути використані тільки в коді ВС, коду користувача вони недоступні. Вони не є об’єктами виконавчої системи, а реалізовані як структури даних зі спеціальними операціями, які можна виконувати над -ями. Такий ресурс допускає різні режими доступу - взаємне виключення (як м’ютекс) і доступ за принципом блокування читання-записування.
Очікування на диспетчерських об’єктах
Потік може синхронізуватися з диспетчерським об’єктом через виконання очікування на його дескрипторі. Для цього менеджер об’єктів надає спеціальні сервіси очікування: очікування одного об’єкта і очікування кількох об’єктів.
Звертаючись до такого сервісу, потрібно задати дескриптор (або масив дескрипторів) об’єкта, на якому треба очікувати. Після звертання до сервісу очікуваная потік змінює диспетчерський стан на очікування, після чого ядро вилучає його керуючий блок із черги готових потоків і додає цей блок до черги очікування, пов’язаної з диспетчерським об’єктом.
Диспетчерський об’єкт може перебувати в одному з двох станів: сигналізованому(signaled) і несигналізованому(nonsignaled). Потік поновлює своє виконання, коли об’єкт, на якому він очікує, переходить у сигналізований стан (відбувається його сигналізація). При цьому виконавча підсистема перевіряє чергу очікування цього об’єкта і поновлює виконання одного або кількох потоків з неї (виконуючи перепланування і, можливо, тимчасово підвищуючи їхній пріоритет).
Способи сигналізації та реакція на неї розрізняються для різних об’єктів. Сигналізація зазвичай відбувається явно (коли інший потік викликає спеціальний метод сигналізації), однак для деяких об’єктів (процесів або потоків) сигналізація може бути і неявною.
Структури даних синхронізації
Для відстеження того, який потік очікує на який об’єкт, використовують дві структури даних: диспетчерський заголовок об’єкта і блок очікування потоку.
Диспетчерський заголовок пов’язаний із диспетчерським об’єктом. Він містить інформацію про тип об’єкта; сигнальний стан; покажчик на список блоків очікування потоків, які очікують на цьому об’єкті.
Блок очікування відображає той потік, що очікує на диспетчерському об’єкті.
Він містить покажчик на цей диспетчерський об’єкт; покажчик на блок KTHREADочікувального потоку; покажчик на наступний блок очікування того самого потоку (якщо потік очікує кілька об’єктів); покажчик на наступний блок очікування, пов’язаний з тим самим об’єктом (якщо цей об’єкт очікують кілька потоків); тип очікування (одного або кількох об’єктів); місце дескриптора цього об’єкта в масиві дескрипторів, переданому сервісу очікування у разі очікування кількох об’єктів.
Програмний інтерфейс взаємодії Win32 АРІ. Функції очікування
Розглянемо засоби синхронізації Win32 АРІ, засновані на використанні об’єктів виконавчої системи із дескрипторами. Для всіх таких об’єктів організація очікування зводиться до викликання потоком керування функції очікування, що приймає як параметр дескриптор об’єкта (або масив дескрипторів) і перевіряє, чи не відбулася сигналізація цього об’єкта. Умова сигналізації залежить від об’єкта синхронізації.
У разі невиконання умови сигналізації потік переходить у стан очікування, витрачаючи дуже мало ресурсів (процесорного часу тощо), доти, поки сигналізація все-таки не відбудеться або поки не мине максимальний час очікування, якщо він був заданий.
Коли сигналізація відбулася, потік негайно виходить зі стану очікування (із функції очікування) і продовжує своє виконання. Функція очікування в цьому разі перед виходом може змінити стан об’єкта (наприклад, зайняти блокування).
М’ютекси Win32 АРІ
Найпростішими синхронізаційними об’єктами із дескрипторами є м’ютекси. Для створення м’ютекса використовують функцію CreateMutex():
HANDLE CreateMutex( // повертає дескриптор м'ютекса
// атрибути безпеки, нульовий покажчик, якщо за замовчуванням LPSECURITY_ATTRIBUTESsec_attrs.
BOOLinit_locked. // відразу зайнятий поточним потоком, якщо TRUELPCTSTRmutex_name); // ім'я або нульовий покажчик, якщо не потрібно
Ім’я м’ютекса задавати не обов’язково, якщо потрібно звертатися до м’ютекса тільки в рамках цього процесу.
Якщо м’ютекс вільний, потік його займає і продовжує виконання. Коли м’ютекс зайнятий (заблокований іншим потоком), то поточний потік очікує, поки його не буде звільнено.
Звільнення м’ютекса здійснює функція ReleaseMutex(mutex). При цьому відбувається сигналізація м’ютекса і потік, що його очікує, поновлюється. Якщо кілька потоків очікували один і той самий м’ютекс, його буде зайнято одним із потоків, при цьому не можна заздалегідь передбачити яким. Після використання дескриптор потрібно закрити функцією CloseHandle(mutex).
М’ютекси Win32 API є рекурсивними.
Альтернативою м’ютексам є об’єкти критичних секцій, які не пов’язані з об’єктами виконавчої системи і працюють ефективніше, але можуть бути використані тільки для синхронізації об’єктів одного процесу.
Контрольні питання:
В чому суть механізмів синхронізації потоків ОС?
Як проходить синхронізація у виконавчій системі?
Як здійснюється очікування на диспетчерських об’єктах?
Які структури даних синхронізації?
Програмний інтерфейс взаємодії Win32 АРІ. Функції очікування.
Що таке м’ютекси Win32 АРІ?
Література: Шеховцов В.А. Операційні системи. – К.: Видавнича група BHV, 2005. – 576 с.: іл., стор. 151-157.
