Сериализация
Ресурсы Исполнительной системы
Ресурсы являются вариантом быстрого мьютекса. Ресурсы не являются диспетчерскими объектами, поэтому они не могут иметь имя и использоваться в функции KeWaitForSingleObject() или KeWaitForMultipleObjects().
Ресурсы предоставляют две формы захвата:
- Эксклюзивный – в этом случае ресурс ведет себя как обычный мьютекс – поток, который попытается захватить такой ресурс для эксклюзивного или совместного использования, будет блокирован.
 - Совместно используемый – в этом случае ресурс может быть одновременно захвачен для совместного использования любым числом потоков.
 
Ресурсы идеально подходят для защиты структур данных, которые могут одновременно читаться несколькими потоками, но должны модифицироваться в каждый момент времени только одним потоком.
Для работы с ресурсами существуют функции запроса эксклюзивного доступа, неэксклюзивного доступа и преобразования уже полученного неэксклюзивного доступа в эксклюзивный и, наоборот, без промежуточных операций освобождения ресурса и запроса нового режима доступа. Все функции должны вызываться на уровне IRQL меньшем DISPATCH_LEVEL.
Функции работы с ресурсами:
- NTSTATUS ExInitializeResourceLite(IN PERESOURCE Resource);
 - VOID ExReinitializeResourceLite(IN PERESOURCE Resource);
 - BOOLEAN ExAcquireResourceExclusiveLite(IN PERESOURCE Resource IN BOOLEAN Wait);
 - BOOLEAN ExTryToAcquireResourceExclusiveLite(IN PERESOURCE Resource);
 - BOOLEAN ExAcquireResourceSharedLite(IN PERESOURCE Resource IN BOOLEAN Wait);
 - BOOLEAN ExAcquireSharedStarveExclusive(IN PERESOURCE Resource IN BOOLEAN Waif);
 - BOOLEAN ExAcquireSharedWaitForExclusive(IN PERESOURCE Resource,IN BOOLEAN Waif);
 - 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 ERESOURCEJTHREAD ResourceThreadld).
 
Обобщенная таблица механизмов синхронизации
В таблице 9 представлены механизмы синхронизации и особенности использования каждого из них.
Таблица 9.Механизмы синхронизации и особенности использования механизмов синхронизации.
| Объект синхронизации | Уровень IRQL, на котором может работать запрашивающий синхронизацию поток | Уровень IRQL, на котором будет работать запросивший синхронизацию поток при освобождении объекта синхронизации или его переходе в сигнальное состояние | |
| Запрос без блокирования потока | Запрос с блокированием потока | ||
| Стандартная спин-блокировка (Standard Spin Lock) | <= DISPATCH_LEVEL | DISPATCHJLEVEL | |
| Спин-блокировка для ISR, определенная по умолчанию (Default ISR Spin Lock) | <= DIRQL | DIRQL | |
| Спин-блокировка для синхронизации с ISR (ISR Synchro nize Spin Lock) | <= Specified DIRQL | Specified DIRQL | |
| Мьютекс (Mutex) | <=DISPATCH_LEVEL | <DISPATCH LEVEL | <=DISPATCH_LEVEL | 
| Семафор (Semaphore) | <=DISPATCKLLEVEL | <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 | <DISPATCfi_LEVEL | |
| Ресурсы (Resources) | < DISPATCH_LEVEL | <DISPATCH_LEVEL | <=DISPATCH_LEVEL | 
