Vraag Wat is een "Async Pinned Handle"?


Ik probeer een echt smerige softwarecrash te onderzoeken die mogelijk te maken heeft met een beheerde heap-corruptie (omdat het gebeurt tijdens een garbagecollectie). Met behulp van WinDbg met de opdracht (SOS)! Greppen krijg ik zoiets

0:000> !gchandles
GC Handle Statistics:
Strong Handles: 259
Pinned Handles: 137
Async Pinned Handles: 1
Ref Count Handles: 79
Weak Long Handles: 197
Weak Short Handles: 650
Other Handles: 0
Statistics:

En ik ben gewoon nieuwsgierig, wat is het verschil tussen een "normale" vastgezette hendel en een "async vastgezette" hendel? En kan ik vinden welke van mijn handles de "asynchrone" is? Ik kon er geen informatie over het net vinden en aangezien het erop lijkt dat de applicatie altijd crasht wanneer deze teller precies één is, kan deze relevant zijn voor de crash. Maar aan de andere kant is het misschien gewoon wat intern spul dat gebruikt wordt tijdens de garbagecollectie ..


23
2017-09-26 12:17


oorsprong


antwoorden:


Vastgezette async-handles zijn sterk gecorreleerd met overlappende I / O in Windows. Dit ondersteunt asynchroon lezen en schrijven met ReadFile en WriteFile, met behulp van het OVERLAPPED-argument. Het apparaatstuurprogramma slaat de doorgegeven bufferaanwijzer op en leest / schrijft direct van / naar de buffer, volledig asynchroon van de werking van het programma. De beheerde wrappermethoden zijn BeginRead en BeginWrite.

Als de buffer is toegewezen in de GC-heap, moet deze worden vastgezet totdat de bestuurder klaar is met het gebruik van de buffer. Laat de GC de buffer verplaatsen terwijl de driver werkt aan de I / O-overdrachten is rampzalig, schrijft zou rommel veroorzaken en reads zouden de GC-heap beschadigen, pinning is vereist om te voorkomen dat de buffer wordt verplaatst terwijl het stuurprogramma deze gebruikt.

Vastgezette voorwerpen zijn behoorlijk onaangenaam, ze geven de vuilnisman een harde tijd om rond de rots in de weg te werken wanneer hij de hoop dichtstopt. Een noodzakelijk kwaad hier, de enige manier om vooruit te komen is om de buffer zo lang mogelijk vast te houden.

Async vastgezette grepen zijn speciaal gemarkeerd om de CLR toe te staan ​​automatisch de buffer los te koppelen voor I / O-voltooiing. Zo snel mogelijk, wanneer de I / O-voltooiingspoort voltooid is en dus niet hoeft te wachten op de clientcode om de callback uit te voeren en de buffer los te maken. Dat kan een tijdje duren als er veel threadspool threads in vlucht zijn. Het is een micro-optimalisatie die de neiging heeft om een ​​macro-optimalisatie te worden wanneer je bijvoorbeeld een webserver hebt die tienduizenden clientaanvragen behandelt.

Het wordt alleen gebruikt voor objecten van het type System.Threading.OverlappedData, een interne klasse in mscorlib.dll waar de CLR speciale kennis van heeft en is het beheerde faxapparaat voor de native OVERLAPPED-structuur die de Windows API-functies gebruiken.

Lang verhaal kort, alles wat je echt weet, is dat er een overlappende I / O in behandeling is als je ziet dat het aantal handvatten op 1 valt als het crasht. Een native-code die overlappende I / O overlapt met gc-toegewezen buffers die niet zijn vastgezet, is overigens een goede manier om de heap te vernietigen. Je hebt trouwens nogal wat gespte handvatten.


26
2017-09-26 13:17