Синхронизация читателей/писателей в NT kernel-mode
- From
- Eugene Muzychenko (2:5000/14)
- To
- All ()
- Date
- 2003-01-26T17:44:04Z
- Area
- SU.WINDOWS.NT.PROG
* Originally in SU.Windows.NT.Prog
* Crossposted in SU.Win32.Prog
Привет!
В драйвере ядра имеется классическая модель "читатели/писатели": список, который часто (десятки-сотни раз в секунду) просматривается как по запросу от задачи (PASSIVE_LEVEL), так и по таймерным событиям (DPC_LEVEL). Изредка по запросу от задачи необходимо модифицировать список. Блокировать его тупым Spin Lock'ом как-то некузяво, ибо это сделает невозможным одновременный просмотр, а такие операции преобладают. А реализовать нормальную синхронизацию мешает отсутствие в kernel-mode API объекта, который можно ожидать на любом IRQL, и которым могут владеть несколько процессов (процессоров) одновременно. Как лучше поступить: сэмулировать такой Spin Lock самому, тупо крутя пустой цикл, или сделать отложенный вызов DPC-шек, чтобы вся обработка шла на PASSIVE_LEVEL и можно было пользоваться KeWaitXXX?
Всего доброго!
Евгений Музыченко
--- GoldED+/W32 1.1.4.7
* Origin: Fox Tracks, Novosibirsk, Russia (2:5000/14)