Типовыми задачами, где используется синхронизация процессов, является задача: потребитель-производитель (доступ к буферу в оперативно памяти нескольких потоков) и читатель-писатель (доступ к данным на внешнем устройстве) Математически обоснованными алгоритмами решений этих задач является алгоритм Деккера и более простой вариант – алгоритм Петерсона. Обобщение этих алгоритмов на 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);
Мьютекс – двоичный семафор, реализует взаимоисключение, аналог критической секции для пользовательского режима.
Монитор - объектно-ориентированные средства, содержат собственные внутренние данные и функции.
Все средства синхронизации ядра эквивалентны, т.е. через любое из них можно реализовать другое.