2 votes

Qu'est-ce qu'une poignée d'événement ?

J'ai eu un problème de fuite de poignée ("Pas assez de quota disponible pour traiter cette commande") dans un code winforms C# dont j'ai hérité, j'ai donc utilisé le logiciel Sysinternals's Poignée pour le retrouver. Il s'est avéré que c'étaient les poignées d'événement qui fuyaient, alors j'ai essayé de faire une recherche sur Google (il m'a fallu plusieurs tentatives pour trouver une réponse). interrogation qui ne renvoie pas "Did you mean : event gestionnaire ?"). D'après le Junfeng Zhang Les poignées d'événements sont générées par l'utilisation de Monitor, et il peut y avoir des règles bizarres en ce qui concerne l'élimination des poignées d'événements et les primitives de synchronisation.

Je ne suis pas tout à fait sûr que la source de mes fuites de handles soit entièrement due à des objets de longue durée de vie appelant beaucoup de synchronisation, car ce code traite également des interfaces HID et beaucoup de marshaling et d'interopérabilité win32, et ne faisait pas de synchronisation à ma connaissance. Quoi qu'il en soit, je vais juste lancer ceci dans windbg et commencer à tracer l'origine des handles, et aussi passer beaucoup de temps à apprendre cette section du code, mais j'ai eu beaucoup de mal à trouver des informations sur ce que sont les event handles en premier lieu.

En page msdn pour l'objet event kernel, il y a juste un lien vers la vue d'ensemble de la synchronisation générique... alors qu'est-ce que les event handles, et en quoi sont-ils différents des mutex/semaphores/quoi que ce soit d'autre ?

3voto

Preet Sangha Points 39414

Le noyau NT utilise des objets événements pour permettre aux signaux d'être transférés à des entités qui attendent le signal. Un mutex et un sémaphore sont également des objets du noyau (Kernel Dispatcher Objects) pouvant être mis en attente, mais avec une sémantique différente. La seule fois où je les ai rencontrés, c'était lors de l'attente de l'achèvement des entrées-sorties dans les pilotes.

Ma théorie sur votre problème est donc qu'il s'agit peut-être d'un pilote défectueux, ou que vous utilisez du matériel spécialisé ?

Edit : More info (à partir de Windows Internals 5ème édition - Chapitre 3 Mécanique des systèmes)

Certains objets de distribution du noyau (par exemple, mutex, sémaphore) ont le concept de propriété. Ainsi, lorsque le signal de libération est émis, un thread en attente sera libéré et s'emparera de ces ressources. Les autres devront continuer à attendre. Les événements n'ont pas de propriétaire et peuvent donc être réinitialisés par n'importe quel thread.

Il existe également trois types d'événements :

  • Notification : En cas de notification, tous les threads en attente sont libérés
  • Synchronisation : En cas de signal, une file d'attente est libérée mais l'événement est réinitialisé.
  • Activé : Sur signal un thread en attente dans le même processus lorsque le signaleur est libéré.

Une autre chose intéressante que j'ai apprise est que sections critiques ( la primitive de verrouillage en c# ) ne sont pas des objets du noyau, mais sont mis en œuvre à partir d'un événement clé, d'un mutex ou d'un sémaphore, selon le cas.

2voto

Tony The Lion Points 28208

S'il s'agit d'un noyau Objets d'événements Dans ce cas, la poignée d'événement est une poignée (Int) que le système conserve sur cet objet afin que d'autres objets puissent s'y référer. IE Keep a 'handle' on it.

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X