Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS(методичка).docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
403.88 Кб
Скачать

4.5.5.3. Типи об'єктів синхронізації

Список об'єктів синхронізації включає такі типи об'єктів:

· Процеси;

· Нитки;

· Події (у вузькому сенсі);

· Мьютекс (двійкові семафори);

· Семафори (Недвійкова);

· Таймери;

· Повідомлення про зміни у каталозі;

· Консольне введення.

Розгляд об'єктів синхронізації найпростіше почати з процесів і ниток. Для тих і інших сигнальним станом є тільки стан завершення роботи. Іншими словами, можна змусити нитка одного процесу очікувати завершення роботи іншої нитки або процесу.

Найпростішим з об'єктів, призначених тільки для синхронізації, є подія (event). Він створюється за допомогою функції CreateEvent, яка вимагає вказати вид події (з автоскиданням або з ручним скиданням), а також його початковий стан - сигнальне або несигнальному. Перехід в сигнальний

стан виконується функцією SetEvent, а в несигнальному - ResetEvent. Функція PulseEvent як би поєднує обидві попередні: сигнальний стан включається, функція очікування, якщо вона була викликана раніше, завершується, але сигнальний стан тут же скидається.

Подія з автоскиданням означає, що функція очікування при завершенні очікування скидає то подія (або події), якого (яких) вона дочекалася. Якщо кілька ниток чекають одного і того ж події з автоскиданням, то розблокована буде тільки одна з них (Windows не гарантує, яка саме), оскільки іншим «події не дістанеться». Навпаки, подія з ручним скиданням залишається в сигнальному стані і може бути скинуто тільки функцією ResetEvent, а до тих пір воно може «нагодувати» скільки завгодно чекаючих ниток.

Можна сказати, що подія з ручним скиданням більше схоже не на подію, а на стан.

Наступний тип об'єктів - мьютекс (mutex). Це майже в чистому вигляді двійковий семафор в сенсі Дейкстри. Мьютекс може бути або вільний (це його сигнальний стан), або захоплений небудь ниткою. При створенні мьютекса в функції CreateMutex вказується його початковий стан. Допускається багаторазовий захоплення мьютекса однієї і тієї ж ниткою, але після цього нитка повинна стільки ж разів звільнити мьютекс, щоб він повернувся у вільний стан.

Для звільнення мьютекса нитка, що володіє їм, викликає функцію ReleaseMutex, яка є аналогом дейкстровской V (S). Ніяка інша нитка, крім власника, не може звільнити «чужий» мьютекс.

У спеціальній функції для захоплення мьютекса немає необхідності, оскільки роботу примітиву P (S) з успіхом виконують функції очікування.

Якщо нитка, яка володіє мьютекс, завершує свою роботу, не звільнивши мьютекс, то він переходить в «занедбаний» стан: тепер вже ніхто не може його звільнити. Таку ситуацію слід вважати ознакою неакуратного програмування, і вона може бути ознакою наявності у програмі більш серйозних помилок синхронізації.

Об'єкт типу семафор (semaphore) являє собою Недвійкова семафор, використовуваний зазвичай для управління розподілом обмеженого числа одиниць ресурсу. У функції CreateSemaphore вказуються два числа: максимальне значення лічильника, пов'язаного з семафором (скільки всього є одиниць ресурсу), та початкове значення цього лічильника (скільки одиниць вільно). Сигнальним є стан семафора з лічильником більше нуля. Функція очікування зменшує лічильник на 1, а функція ReleaseSemaphore збільшує його на задану кількість одиниць, але так, щоб результат не перевищував максимального значення.

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

Таймер «для очікування» (waitable timer) створюється за допомогою функції CreateWaitableTimer, після чого повинен ще бути встановлений функцією SetWaitableTimer. При створенні таймера вказується його вид: з ручним скиданням або з автоскиданням, аналогічно об'єкту «подія». При виклику SetWaitableTimer вказується час до переходу в сигнальний стан, в одиницях по 100 нс. Час можна вказати або абсолютно (коли «задзвонити»), або щодо поточного моменту (як довго чекати). Можна також вказати період (в мілісекундах), через який повинен повторюватися сигнал.

Таймер з ручним скиданням, перейшовши в сигнальний стан, залишається в ньому до виклику функції CancelWaitableTimer або повторного виклику SetWaitableTimer. Таймер з автоскиданням може бути також скинутий функціями очікування.

Корисно нагадати, що в Windows широко використовується й інший тип таймерів «для повідомлень», створюваний функцією SetTimer, але ці таймери не можуть взаємодіяти з функціями очікування і навіть не є об'єктами.

Об'єкт типу повідомлення про зміни створюється за допомогою функції FindFirstChangeNotification. При цьому вказуються такі аргументи:

· Каталог файлової системи, зміни в якому повинні відслідковуватися;

· Прапор, який вказує, чи повинні відслідковуватися зміни тільки в заданому каталозі або також у всіх вкладених підкаталогах;

· Фільтр відслідковуються змін.

Фільтр змін являє собою маску, в якій окремі біти задають такі події, як зміна списку імен файлів і каталогів (це включає їх створення, видалення і перейменування), зміна атрибутів файлу, розміру, дати зміни і атрибутів захисту.

Функція повертає хендл об'єкта, який переходить в сигнальний стан один раз, при першій появі одного з включених у фільтр змін. Якщо потрібно повторювати відстеження, слід викликати функцію FindNextChangeNotification, передаючи їй хендл. Для видалення об'єкта потрібно викликати функцію з диким ім'ям FindCloseChangeNotification.

Повідомлення про зміни дозволяють уникнути активного очікування для програм, які повинні відслідковувати і відображати стан каталогів в динаміці (як це роблять, наприклад, Провідник чи Far Manager). При цьому характер сталося зміни програма може з'ясувати, тільки перечитавши каталог, але зате достеменно відомо, що якась зміна було.

Хендл об'єкта типу консольне введення повертається функцією CreateFile, у якої замість імені файлу, що відкривається зазначено пристрій консольного вводу (CONIN $). Об'єкт в сигнальному стані, коли в буфері введення є непрочитані символи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]