Синхронизация читателей/писателей в NT kernel-mode
- From
- Eugene Muzychenko (2:5000/14)
- To
- Gennady Mayko ()
- Date
- 2003-01-26T23:21:39Z
- Area
- SU.WINDOWS.NT.PROG
Привет!
26 Jan 03 17:42, you wrote to me:
GM> Во-первых, какая OS?
NT, какая же еще? ;) Я же в subj написал. Другие винды мультипроцессорности не поддерживают пока :)
EM>> по таймерным событиям (DPC_LEVEL).
GM> Здесь, наверное, имеется ввиду DISPATCH_LEVEL, нет?
Угу, отчего-то мне казалось, что есть такой синоним для DISPATCH_LEVEL, а оказалось, что нет.
EM>> Как лучше поступить: сэмулировать такой Spin Lock самому, тупо крутя
EM>> пустой цикл, или сделать отложенный вызов DPC-шек, чтобы вся
EM>> обработка шла на PASSIVE_LEVEL и можно было пользоваться KeWaitXXX?
GM> Здесь тоже не понятно - насколько я знаю, DPC процедуры будут
GM> стартоваться и выполняться на DISPATCH_LEVEL, а не на PASSIVE_LEVEL.
Строго говоря, они вызываются при опускании уровня ниже DISPATCH, но для непрерывности им перед вызовом уровень принудительно поднимается до DISPATCH. Я имел в виду проверять в DPC, не захватил ли кто-то список на PASSIVE, и если да, то откладывать отработку до возврата из того обработчика.
GM> Нужно не забывать, что в один и тот же момент времени на SMP машине
GM> могут выполняться несколько DPC, что в любом случае требует наличия
GM> той или иной синхронизации при доступе из кода DPC к разделяемым
GM> данным.
Угу, тоже проблема :( Похоже, по-человечески ее фиг решишь, придется таки вешать обычный spin lock :(
GM> Если же используется один отдельный thread, через который (только)
GM> организуется доступ к списку, то его код гарантировано
GM> будет выполняться на одном процессоре и его синхронизировать с "самим
GM> собой" не нужно.
Это понятно, но процессы-то в реальном времени. Если spin lock'и будут тормозить систему, то такой подход будет тормозить сам процесс...
Всего доброго!
Евгений Музыченко
--- GoldED+/W32 1.1.4.7
* Origin: Fox Tracks, Novosibirsk, Russia (2:5000/14)