Алиса права. Функция драйвера под виндой с разных точек одновременно не вызовется. Более того, насколько я помню, как правило даже ядро системы не вылазит за пределы одного процессорного ядра, во всяком случае до XP включительно. Если разные функции - тут понятно, но так как она одна и та же, то смысла оборачивать не вижу.
Простой контрпример: два приложения вызвают драйвер (явно или косвенно непринципииально), две нити этих приложений выполняются на двух процессорах, каждая нить сейчас обрабатывает в ядре соответствующий IRP, следовательно функция-обработчик драйвера исполняется параллельно на двух процессорах, следоватательно нужна синхронизация
если вы работаете с глобальной переменной только из одной функции, то у вас на выбор: а) синхронизация данных на мьютексе/ресурсах б) синхронизация кода (но критические секции в ядре недокументированы насколько я помню) в) использовать атомарные (InterlockedXxx) операции
> каждая нить сейчас обрабатывает в ядре соответствующий IRP, > следовательно функция-обработчик драйвера исполняется параллельно на двух процессорах, не вижу причинно-следственной связи между этими утверждениями.
почитайте в DDK про обработку ввода-вывода, два приложения могут обратиться к одному устройству одновременно? IRP_MJ_CREATE будет посылаться в драйвер на доступ к устройству? функция обработчик IRP_MJ_CREATE может выполнятся параллельно в двух нитях двух приложений?
Виндоус такой виндоус, что можно ожидать... Функция-обработчик может хоть в десяти нитях выполняться, хоть на сколько процессорных ядер будет распихана ядром, но для самого нижнего уровня работы с оборудованием для драйверов режима ядра проявлять излишнюю заботу о глобальных переменных надо не всегда, не для всех устройств и не для всех типов ядра системы. Впрочем, сейчас модно писать код, исходя из неких заданных правил без подключения аналитического аппарата межушного нервного узла. Nothing personal, я еще раз согласен с тем, что для сферического коня в вакууме вы правы. А зрить в корень, по заветам мудрейшего Козьмы Пруткова, дано не всем. Не принимайте близко к сердцу, вам просто не повезло с выбранной платформой.
Олли, не тупи. Твой драйвер забожежмой может параллельно выполняться в два ствола двумя ведрами (а то и поболе если ведер побольше). Сколько народу с постановкой сплайсинга неатомарными операциями в этот жыр по пояс вступило. На васме уж талмуд для чайнегов написали даже на тему что щщасте на SMP системах кончается. Есть еще гении которые на одном ведре прерывания отрубают а потом искренне удивляются какого хера оно валится...
Синхронизируй. Иначе в ламеры спишут, и будут абсолютно правы.
Граждане комментаторы. Для сферического случая в вакууме вы может быть и правы. Но скажите мне, с каких пор у нас драйверы вне пространства ведра работают?
Comments 24
Reply
Reply
Reply
функции драйвера могт вызываться паралелльно,
мультипроцессорное ядро есть начиная с самого начала (NT 3.0) - файл ntoskrnlmp
Reply
Reply
Reply
два приложения вызвают драйвер (явно или косвенно непринципииально),
две нити этих приложений выполняются на двух процессорах,
каждая нить сейчас обрабатывает в ядре соответствующий IRP,
следовательно функция-обработчик драйвера исполняется параллельно на двух процессорах,
следоватательно нужна синхронизация
если вы работаете с глобальной переменной только из одной функции, то у вас на выбор:
а) синхронизация данных на мьютексе/ресурсах
б) синхронизация кода (но критические секции в ядре недокументированы насколько я помню)
в) использовать атомарные (InterlockedXxx) операции
Reply
> следовательно функция-обработчик драйвера исполняется параллельно на двух процессорах,
не вижу причинно-следственной связи между этими утверждениями.
Reply
два приложения могут обратиться к одному устройству одновременно?
IRP_MJ_CREATE будет посылаться в драйвер на доступ к устройству?
функция обработчик IRP_MJ_CREATE может выполнятся параллельно в двух нитях двух приложений?
и внимательно читать вот это:
http://msdn.microsoft.com/en-us/library/ff564617(v=VS.85).aspx
Reply
Reply
Синхронизируй. Иначе в ламеры спишут, и будут абсолютно правы.
Reply
Reply
Reply
Reply
Leave a comment