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

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

Добрый день!
 
 EM> Привет!

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

 EM> NT, какая же еще? ;) Я же в subj написал. Другие винды
 EM> мультипроцессорности не поддерживают пока :)
--
Я спрашивал о типе OS потому, что в новых OS иногда появляются новые
возможности (типа Queued Spin locks для XP и т.п.).
То есть имеется ввиду NT4, так?



 EM> Строго говоря, они вызываются при опускании уровня ниже DISPATCH, но для
 EM> непрерывности им перед вызовом уровень принудительно поднимается до
 EM> DISPATCH. Я имел в виду проверять в DPC, не захватил ли кто-то список на
 EM> PASSIVE, и если да, то откладывать отработку до возврата из того
 EM> обработчика.
--
А как откладывать то? Если крутится в DPC, то есть шанс что код на
PASSIVE_LEVEL никогда не выполнится; если перезапустить DPC еще раз, то она
сразу же выполнится и это ничем не отличается от первого случая. Единственно
что остается - сразу же прекратить DPC.

В таких случаях я обычно синхронизируюсь "наверх", поднимая приоритет потоков.




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

 EM> Это понятно, но процессы-то в реальном времени. Если spin lock'и будут
 EM> тормозить систему, то такой подход будет тормозить сам процесс...
--
Несколько раз мы использовали отдельные thread'ы для синхронизации доступа к
разделяемым ресурсам. Однажды мы использовали отдельный thread в kernel mode
для имитации дополнительного канала DMA или для имитации генерации большого
числа данных от чипа, когда его еще физически не сделали. Система при этом
более или менее работала.

Если речь идет о real time на Windows NT, то, по моему, здесь можно
общеупотребительные правила и нарушить и даже вежливо попросить пользователя
не запускать другие программы и не шевелить мышкой :)


В описываемом же случае, как мне кажется, лучше просто поднимать IRQL до
DISPATCH_LEVEL (когда это нужно) и иcпользовать общий spin lock.


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

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

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