Сериализация
Ресурсы Исполнительной системы
Ресурсы являются вариантом быстрого мьютекса. Ресурсы не являются диспетчерскими объектами, поэтому они не могут иметь имя и использоваться в функции 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 |