Синхронизация в режиме ядра. Семафоры, мьютексы. Типичные задачи: производители-потребители и читатели-писатели

Типовыми задачами, где используется синхронизация процессов, является задача: потребитель-производитель (доступ к буферу в оперативно памяти нескольких потоков) и читатель-писатель (доступ к данным на внешнем устройстве) Математически обоснованными алгоритмами решений этих задач является алгоритм Деккера и более простой вариант – алгоритм Петерсона. Обобщение этих алгоритмов на n-процессов называется алгоритм булочной.

Средства синхронизации в режиме ядра. Основное средство – семафоры – представляют собой целую переменную, которая принимает не отрицательные значения и к которой осуществляется доступ через две атомарные операции.

Реализация:

HANDLE CreateSemaphore(PSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximumCount, PCTRTR pszName)// lInitialCount – начальное значение счетчика.

HANDLE OpenSemaphore(DWORD fdwAccess, BOOL bInhentHandle, PCTSTR pszName); – открыть семафор.

Реализуется:

DWORD WaitForSingleObject(HANDLE obj, DWORD Miliseconds); // если счетчик = 0, то ставит его в очередь ожидания.

BOOL ReleaseSemaphore(HANDLE hSem, LONG lReleaseCount, PLONG p]PreviousCount);

Мьютекс – двоичный семафор, реализует взаимоисключение, аналог критической секции для пользовательского режима.

Монитор - объектно-ориентированные средства, содержат собственные внутренние данные и функции.

Все средства синхронизации ядра эквивалентны, т.е. через любое из них можно реализовать другое.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: