Что такое дескрипторы событий? - PullRequest
2 голосов
/ 04 марта 2010

У меня возникла проблема с утечкой («Недостаточно квоты для обработки этой команды.») В некотором унаследованном коде winforms C #, поэтому я пошел и использовал инструмент Sysinternals Handle , чтобы отследить его.Оказалось, что это были дескрипторы событий, которые протекали, поэтому я попытался погуглить его (взял пару попыток найти запрос , который не возвращал "Вы имели в виду: событие обработчик ?").Согласно Junfeng Zhang , дескрипторы событий генерируются с помощью Monitor, и могут быть некоторые странные правила, касающиеся удаления дескрипторов событий и примитивов синхронизации.

Я не совсемЯ уверен, что источник моих утечек связан исключительно с долгоживущими объектами, вызывающими много вещей синхронизации, так как этот код также имеет дело с интерфейсами HID и большим количеством маршалинга и взаимодействия win32, и не делал никакой синхронизации, о которой я знализ.В любом случае, я просто собираюсь запустить это в windbg и начать отслеживать, откуда берутся маркеры, а также потратить много времени на изучение этого раздела кода, но мне было очень трудно найти информацию о том, какое событиедескрипторы в первую очередь.

Страница msdn для объекта ядра событий просто ссылается на общий обзор синхронизации ... так что же такое дескрипторы событий и чем они отличаются от мьютексов/ семафоры / что?

Ответы [ 2 ]

3 голосов
/ 04 марта 2010

Ядро NT использует объекты событий, чтобы разрешить передачу сигналов объектам, ожидающим сигнала. Мьютекс и семафор также являются ожидаемыми объектами ядра (Kernel Dispatcher Objects), но с другой семантикой. Единственный раз, когда я сталкивался с ними, это ожидание завершения ввода-вывода в драйверах.

Итак, моя теория по вашей проблеме - возможно, неисправный драйвер, или вы полагаетесь на специализированное оборудование?

Редактировать: Подробнее (из Windows Internals, 5-е издание - Глава 3 Механика системы)

Некоторые объекты диспетчера ядра (например, мьютекс, семафор) имеют концептуальную собственность. Таким образом, при получении сигнала об освобождении один ожидающий поток освободит эти ресурсы. А другим придется ждать дальше. События не принадлежат, поэтому доступны для сброса любым потоком.

Также есть три типа событий:

  • Уведомление: при наличии сигнала все ожидающие потоки освобождаются
  • Синхронизация: при сигнале освобождается один ожидающий поток, но событие сбрасывается
  • Keyed: On сигнализирует об одном ожидающем потоке в том же процессе , в котором освобождается сигнализатор.

Еще одна интересная вещь, которую я узнал, состоит в том, что критические секции ( примитив блокировки в c # ) на самом деле не являются объектами ядра, скорее они реализованы из события с ключом, или мьютекс или семафор, как требуется.

2 голосов
/ 04 марта 2010

Если вы говорите о ядре Объекты события , то дескриптор события будет дескриптором (Int), который система хранит для этого объекта, чтобы другие объекты могли ссылаться на него. IE держите «ручку» на нем.

Надеюсь, это поможет!

...