- •Системное программное обеспечение эвм
- •Часть 1 в. А. Супонев, а. А. Уваров, в. А. Прытков Операционные системы
- •Содержание
- •Введение
- •1.1. Знакомство с Linux
- •1.2. Понятие процессов
- •1.2.1. Linux
- •1.2.2. Windows
- •1.3. Задание
- •2.1. Linux
- •2.2. Windows
- •2.3. Задание
- •3.1. Linux
- •3.2. Windows
- •3.3. Задание
- •4.1. Linux
- •4.2. Windows
- •4.3. Задание
- •5.1. Асинхронные файловые операции
- •5.1.1. Linux
- •5.1.2. Windows
- •5.2. Динамические библиотеки
- •5.2.1. Linux
- •5.2.2. Windows
- •5.3. Задание
- •6.1. Общие сведения
- •6.2. Задание
- •7.1. Общие сведения
- •7.2. Задание
- •Литература
- •Часть 1. Операционные системы
- •220013, Минск, п. Бровки, 6
2.2. Windows
Для синхронизации процессов в Windows обычно используются события и семафоры.
События
Один из самых распространенных механизмов межпроцессной синхронизации в Windows – события. Они не являются полным аналогом unix-сигналов, представляя собой бинарные флаги, имеющие два потенциальных состояния: сигнальное и несигнальное. Событие может быть одним из двух типов: со сбросом вручную и с автосбросом.
Для создания события используется функция CreateEvent():
HANDLE CreateEvent(PSECURITY_ATTRIBUTES psa, BOOL fManualReset, BOOL fInitialState, PCTSTR pszName);
Функция принимает следующие параметры:
psa – атрибуты защиты;
fManualReset – TRUE, если событие сбрасывается вручную, FALSE в противном случае;
fInitialState – начальное состояние события (TRUE – сигнальное, FALSE - несигнальное);
pszName – уникальное имя-идентификатор события.
Получить доступ к событию из другого процесса можно одним из следующих способов:
вызвать функцию CreateEvent() с тем же именем, которое было присвоено событию первым процессом;
унаследовать дескриптор;
применить функцию DuplicateHandle();
вызвать функцию OpenEvent() с указанием имени существующего события.
Управлять состоянием события позволяют функции: SetEvent() – переводит событие в сигнальное состояние, и ResetEvent() – в несигнальное. Для ожидания события используется функция WaitForSingleObject(). Если событие создано с флагом автосброса, то при успешном окончании ожидания событие автоматически переведется в несигнальное состояние.
Семафоры
Второй рассматриваемый тип синхронизирующих объектов в Windows – семафоры. Принципиальных различий между семафорами в Unix и Windows не так много. Основное различие для программиста заключается в инструментальных средствах управления семафорами.
В Windows семафор создается функцией CreateSemaphore():
HANDLE CreateSemaphore( PSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximumCount, PCTRTR pszName);
Функция принимает следующие параметры:
psa – атрибуты защиты;
fManualReset – TRUE, если событие сбрасывается вручную, FALSE – в противном случае;
lInitialCount – начальное значение счетчика семафора;
lMaxCount – максимальное значение счетчика семафора;
pszName – уникальное имя-идентификатор события.
Очевидно, что в отличие от Linux, Windows оперирует не наборами, а отдельными семафорами. Унаследовать созданный семафор можно теми же методами, что и событие. Для открытия семафора можно использовать функцию OpenSemaphore().
При вызове функции ReleaseSemaphore() значение счетчика ресурсов увеличивается. При этом его можно изменить не только на 1, как это обычно делается, но и на любое другое значение.
Дождаться освобождения ресурса (ненулевого состояния семафора) можно при помощи функций WaitForSingleObject(), WaitForMultipleObjects(), MsgWaitForMultipleObjects(). При этом счетчик ресурсов автоматически будет уменьшен на единицу.
