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

4.4.2. Семафори

Останній засіб синхронізації процесів – використання семафорів. Семафори Novell NetWare - це ресурси, розташовані фізично на файл-сервері.

Програма може відкрити / створити семафор за допомогою функції OpenSemaphore (), вказавши його ім'я. Функція, що відкриває семафор, повертає індекс семафора, який використовується для виконання всіх операцій над семафора.

З семафором крім імені зв'язується деяке число (значенням семафора) в діапазоні від -127 до127.

Крім того, для кожного семафора є лічильник процесів, які відкрили семафор. Цей лічильник збільшує своє значення на 1, коли чергова ПП відкриває семафор функцією OpenSemaphore (), і зменшує на одиницю, коли одна з ПП закриває семафор функцією CloseSemaphore (). Коли лічильник приймає нульове значення, семафор знищується.

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

Після завершення роботи з критичним ресурсом ПП повинна збільшити значення семафора, викликавши функцію SignalSemaphore ().

Початкове значення семафора задається при його створенні і звичайно дорівнює одиниці.

Наприклад, прототип функції OpenSemaphore (), яка відкриває семафор:

int OpenSemaphore (char * SemaphoreName,

int InitialValue,

long * SemaphoreHandle, WORD * OpenCount);

Параметр SemaphoreName визначає ім'я семафор, який відкривається. Ім'я повинно мати довжину ≤ 127 символів, включаючи закриваючий рядок двійковий нуль.

Параметр InitialValue задає значення семафора, але тільки при першому відкритті, тобто при створенні семафора. Якщо семафор вже створений іншим процесом, цей параметр ігнорується. В якості початкового значення можна використовувати одиницю.

Параметр SemaphoreHandle - покажчик на змінну, в яку буде записаний індекс відкритого семафора. Цей індекс необхідний для виконання всіх операцій з семафора.

Параметр OpenCount - лічильник використання семафора. Коли черговий процес відкриває даний семафор, лічильник збільшує своє значення на одиницю.

Функція повертає 0 при успішному завершенні або такі коди помилки: 0xFE - неправильна довжина імені семафора; 0xFF - неправильне початкове значення семафора.

Для того щоб закрити семафор, необхідно використовувати функцію CloseSemaphore ():

int CloseSemaphore (long SemaphoreHandle);

Як параметр цієї функції вказується індекс закриваючого семафора.

Функція повертає 0 при успішному завершенні або такий код помилки: 0xFF - неправильне значення індексу семафора.

За допомогою функції ExamineSemaphore ()можна дізнатися поточний стан семафора:

int ExamineSemaphore (long SemaphoreHandle,

int * SemaphoreValue, WORD * OpenCount);

Для заданого першим параметром семафора функція повертає значення семафора (SemaphoreValue) і лічильник використання (OpenCount). Функція повертає 0 при успішному завершенні або такий код помилки: 0xFF - неправильне значення індексу семафора.

Перед використанням критичного ресурсу ПП повинна викликати функцію WaitOnSemaphore (), яка зменшує значення семафора: int WaitOnSemaphore (long SemaphoreHandle, WORD Timeout);

Параметр SemaphoreHandle визначає використовуваний семафор. За допомогою параметра Timeout визначається час, протягом якого функція очікує доступність ресурсу (в тіках). Функція повертає 0 при успішному завершенні або такий код помилки: 0xFE - закінчився час очікування, заданий параметром Timeout; 0xFF - неправильне значення індексу семафора.

Функція SignalSemaphore (), яка збільшує значення семафора, має наступний прототип: int SignalSemaphore (long SemaphoreHandle);

Індекс семафора задається параметром функції. Функція повертає 0 при успішному завершенні або такий код помилки: 0x01 - переповнення семафора, значення семафора стало більше 127; 0xFF- неправильне значення індексу семафора.

Для роботи з семафорами можна використовувати функцію C5h переривання INT 21h. У залежності від зачення регістра AL ця функція виконує ту чи іншу операцію з семафора.

Відкриття семафора: На вході: AH = C5h; AL = 00h; DS: DX = Адреса імені семафора; CL = Початкове значення семафора. На виході: AL = Код помилки або 0, якщо операція завершилася без помилок.

Визначення стану семафора: На вході: AH = C5h; AL = 01h; CX, DX = Індекс семафора; На виході: AL = Код помилки або 0, якщо операція завершилася без помилок; CX = Значення семафора; DL = Лічильник використань семафора.

Зменшення значення семафора: На вході: AH = C5h; AL = 02h; CX, DX = Індекс семафора; BP = Час очікування. На виході: AL = Код помилки або 0, якщо операція завершилася без помилок.

Збільшення значення семафора: На вході: AH = C5h; AL = 03h; CX, DX = Індекс семафора. На виході: AL = Код помилки або 0, якщо операція завершилася без помилок.

Закриття семафора: На вході: AH = C5h; AL = 04h; CX, DX = Індекс семафора. На виході: AL = Код помилки або 0, якщо операція завершилася без помилок.