- •Лекция №11. Механизмы синхронизации
- •[11.1] Спин-блокировки
- •[11.1.1] Использование обычных спин-блокировок
- •[11.1.1.2] Проблема взаимоблокировок (deadlocks)
- •[11.2] Диспетчерские объекты
- •[11.2.1] Ожидание (захват) диспетчерских объектов
- •[11.2.2] Мьютексы ядра
- •[11.2.3] Семафоры
- •[11.2.4] События (events)
- •[11.3] Быстрые мьютексы
- •[11.4] Ресурсы Исполнительной системы
- •[11.5] Подведение итогов
[11.3] Быстрые мьютексы
Быстрый мьютекс являются урезанным вариантом мьютекса, который не может быть рекурсивно захвачен. Поскольку быстрый мьютекс не является диспетчерским объектом, он не может использоваться функцией KeWaitForSingleObject() или KeWaitForMultipleObjects(). Вместо этого нужно использовать функцию ExAcquireFastMutex(). Эквивалента быстрым мьютексам на пользовательском уровне нет, поэтому они могут использоваться только для синхронизации кода режима ядра.
Функции работы с быстрыми мьютексами
VOID ExInitializeFastMutex(IN PFAST_MUTEX FastMutex);
VOID ExAcquireFastMutex(IN PFAST_MUTEX FastMutex);
BOOLEAN ExTryToAcquireFastMutex(IN PFAST_MUTEX FastMutex);
VOID ExReleaseFastMutex(IN PFAST_MUTEX FastMutex);
VOID ExAcquireFastMutexUnsafe(IN PFAST_MUTEX FastMutex);
VOID ExReleaseFastMutexUnsafe (IN PFAST_MUTEX FastMutex);
[11.4] Ресурсы Исполнительной системы
Ресурсы являются вариантом мьютекса. Ресурсы не являются диспетчерскими объектами, поэтому они не могут иметь имя и использоваться в функции KeWaitForSingleObject() или KeWaitForMultipleObjects(). Ресурсы предоставляют две формы захвата:
Эксклюзивный – в этом случае ресурс ведет себя как обычный мьютекс – поток, который попытается захватить такой ресурс для эксклюзивного или совместного использования, будет блокирован
Совместно используемый – в этом случае ресурс может быть одновременно захвачен для совместного использования любым числом потоков.
Ресурсы идеально подходят для защиты структур данных, которые могут одновременно читаться несколькими потоками, но должны модифицироваться в каждый момент времени только одним потоком.
Для работы с ресурсами существуют функции запроса эксклюзивного доступа, неэксклюзивного доступа и преобразования уже полученного неэксклюзивного доступа в эксклюзивный и наоборот без промежуточных операций освобождения ресурса и запроса нового режима доступа. Все функции должны вызываться на уровне IRQL < DISPATCH_LEVEL.
Функции работы с ресурсами
NTSTATUS ExInitializeResourceLite(IN PERESOURCE Resource);
VOID ExReinitializeResourceLite(IN PERESOURCE Resource);
BOOLEAN ExAcquireResourceExclusiveLite(IN PERESOURCE Resource,IN BOOLEANWait);
BOOLEAN ExTryToAcquireResourceExclusiveLite(IN PERESOURCE Resource);
BOOLEAN ExAcquireResourceSharedLite(IN PERESOURCE Resource,IN BOOLEANWait);
BOOLEAN ExAcquireSharedStarveExclusive(IN PERESOURCE Resource,IN BOOLEANWait);
BOOLEAN ExAcquireSharedWaitForExclusive(IN PERESOURCE Resource,IN BOOLEANWait);
VOID ExConvertExclusiveToSharedLite(IN PERESOURCE Resource);
BOOLEAN ExIsResourceAcquiredExclusiveLite(IN PERESOURCE Resource);
USHORT ExIsResourceAcquiredSharedLite(IN PERESOURCE Resource);
ULONG ExGetExclusiveWaiterCount(IN PERESOURCE Resource);
ULONG ExGetSharedWaiterCount(IN PERESOURCE Resource);
NTSTATUS ExDeleteResourceLite(IN PERESOURCE Resource);
VOID ExReleaseResourceForThreadLite(IN PERESOURCE Resource,
IN ERESOURCE_THREAD ResourceThreadId);
[11.5] Подведение итогов
В таблице 2 представлены механизмы синхронизации и особенности использования каждого из них.
Таблица 2
Объект синхронизации |
Уровень IRQL, на котором может работать запрашивающий синхронизацию поток |
Уровень IRQL, на котором будет работать запросивший синхронизацию поток при освобождении объекта синхронизации или его переходе в сигнальное состояние | |
Запрос без блокирования потока |
Запрос с блокированием потока. | ||
Standard Spin Lock |
<= DISPATCH_LEVEL |
DISPATCH_LEVEL | |
Default ISR Spin Lock |
<= DIRQL |
DIRQL | |
ISR Synchronize Spin Lock |
<= Specified DIRQL |
Specified DIRQL | |
Мьютекс(Mutex) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
<=DISPATCH_LEVEL |
Семафор(Semaphore) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
<=DISPATCH_LEVEL |
Событиесинхронизации(Synchronization Event) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
<=DISPATCH_LEVEL |
Событиеуведомления(Notification Event) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
<=DISPATCH_LEVEL |
Таймерсинхронизации(Synchronization Timer) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
- |
Таймеруведомления(Notification Timer) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
- |
Процесс(Process) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
- |
Поток(Thread) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
- |
Файл(File) |
<=DISPATCH_LEVEL |
<DISPATCH_LEVEL |
- |
Ресурсы(Resources) |
< DISPATCH_LEVEL |
<DISPATCH_LEVEL |
<=DISPATCH_LEVEL |
Лекция №11. Механизмы синхронизации 1
[11.1] Спин-блокировки 1
[11.1.1] Использование обычных спин-блокировок 2
[11.1.1.2] Проблема взаимоблокировок (deadlocks) 3
[11.2] Диспетчерские объекты 3
[11.2.1] Ожидание (захват) диспетчерских объектов 5
[11.2.2] Мьютексы ядра 5
[11.2.3] Семафоры 6
[11.2.4] События (events) 7
[11.3] Быстрые мьютексы 8
[11.4] Ресурсы Исполнительной системы 9
[11.5] Подведение итогов 9
Объект синхронизации 10