Синхронизация читателей/писателей в 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)