Синхронизация читателей/писателей в NT kernel-mode

From
Gennady Mayko ()
To
Eugene Muzychenko ()
Date
2003-01-26T17:42:24Z
Area
SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>

Добрый день!

 EM> Привет!

Во-первых, какая OS?


 EM> В драйвере ядра имеется классическая модель "читатели/писатели": список,
 EM> который часто (десятки-сотни раз в секунду) просматривается как по
 EM> запросу от задачи (PASSIVE_LEVEL), так и по таймерным событиям
 EM> (DPC_LEVEL).
--
Здесь, наверное, имеется ввиду DISPATCH_LEVEL, нет?


 Изредка по запросу от задачи необходимо модифицировать
 EM> список. Блокировать его тупым Spin Lock'ом как-то некузяво, ибо это
 EM> сделает невозможным одновременный просмотр, а такие операции преобладают.
 EM> А реализовать нормальную синхронизацию мешает отсутствие в kernel-mode
 EM> API объекта, который можно ожидать на любом IRQL, и которым могут владеть
 EM> несколько процессов (процессоров) одновременно. Как лучше поступить:
 EM> сэмулировать такой Spin Lock самому, тупо крутя пустой цикл, или сделать
 EM> отложенный вызов DPC-шек, чтобы вся обработка шла на PASSIVE_LEVEL и
 EM> можно было пользоваться KeWaitXXX?
--
Здесь тоже не понятно - насколько я знаю, DPC процедуры будут стартоваться и
выполняться на DISPATCH_LEVEL, а не на PASSIVE_LEVEL.


Нужно не забывать, что в один и тот же момент времени на SMP машине могут
выполняться несколько DPC, что в любом случае требует наличия той или иной
синхронизации при доступе из кода DPC к разделяемым данным.
Если же используется один отдельный thread, через который (только)
организуется доступ к списку, то его код гарантировано будет выполняться на
одном процессоре и его синхронизировать с "самим собой" не нужно.


 EM> Всего доброго!
 EM> Евгений Музыченко

C уважением,
Геннадий Майко.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)