Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка С_Р 2 частина.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Урок № 97

(згідно навчальної робочої програми)

Тема: «Взаємодія потоків у Windows ХР»

Питання:

  1. Механізми синхронізації потоків ОС.

  2. Синхронізація у виконавчій системі.

  3. Очікування на диспетчерських об’єктах.

  4. Структури даних синхронізації.

  5. Програмний інтерфейс взаємодії Win32 АРІ. Функції очікування.

  6. М’ютекси 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 є рекурсивними.

Альтернативою м’ютексам є об’єкти критичних секцій, які не пов’язані з об’єк­тами виконавчої системи і працюють ефективніше, але можуть бути використані тільки для синхронізації об’єктів одного процесу.

Контрольні питання:

  1. В чому суть механізмів синхронізації потоків ОС?

  2. Як проходить синхронізація у виконавчій системі?

  3. Як здійснюється очікування на диспетчерських об’єктах?

  4. Які структури даних синхронізації?

  5. Програмний інтерфейс взаємодії Win32 АРІ. Функції очікування.

  6. Що таке м’ютекси Win32 АРІ?

Література: Шеховцов В.А. Операційні системи. – К.: Видавнича група BHV, 2005. – 576 с.: іл., стор. 151-157.