Condividi tramite


I thread visualizzano i report della sequenza temporale nel visualizzatore di concorrenza

Questo articolo fornisce informazioni sui report della sequenza temporale nella visualizzazione Thread del visualizzatore di concorrenza.

Tempo di esecuzione (visualizzazione Thread)

Questi segmenti nella vista della sequenza temporale dei thread rappresentano il tempo di esecuzione, quando il thread esegue attivamente il lavoro su un core logico all'interno del sistema.

Le modifiche apportate allo stato del thread vengono rilevate tramite eventi di cambio del contesto del kernel. Event Tracing for Windows (ETW) acquisisce gli stack di campioni ogni millisecondo. In un segmento verde molto breve, è possibile che non venga preso alcun campione. Di conseguenza, alcuni segmenti di esecuzione brevi potrebbero non mostrare stack di chiamate.

Quando si fa clic su un segmento di esecuzione, il visualizzatore di concorrenza visualizza lo stack di esempio più vicino alla posizione del clic. La posizione dello stack di esempio viene visualizzata da una freccia nera o da un cursore sopra la sequenza temporale e lo stack di esempio viene visualizzato nella scheda Corrente .

Per visualizzare un profilo di campionamento tradizionale per tutti i segmenti di esecuzione nella visualizzazione corrente, fare clic su Esecuzione nel profilo sequenza temporale visibile.

Tempo di I/O (Visualizzazione dei Thread)

Questi segmenti nella sequenza temporale sono associati ai tempi di blocco classificati come I/O. Ciò significa che un thread è in attesa del completamento di un'operazione di I/O. Il thread potrebbe essere stato bloccato in un'API o da un kernel correlato all'I/O attendere che il visualizzatore di concorrenza sia conteggiato come I/O. API come CreateFile(), ReadFile()e WSARecv() rientrano in questo gruppo.

Tempo di gestione della memoria

Questi segmenti nella sequenza temporale sono associati ai tempi di blocco classificati come Gestione memoria. Questo scenario implica che un thread è bloccato da un evento associato a un'operazione di gestione della memoria, ad esempio paging. Durante questo periodo, un thread è stato bloccato in un'API o in uno stato del kernel che il visualizzatore di concorrenza conteggia come gestione della memoria. Questi includono eventi come il paging e l'allocazione di memoria.

Esaminare gli stack di chiamate e i report del profilo associati per comprendere meglio i motivi sottostanti per i blocchi classificati come Gestione memoria.

Tempo di precedenza

Questi segmenti nella sequenza temporale sono associati al tempo di blocco categorizzato come Preemption. Questa categoria implica che un thread viene disattivato a causa di uno di questi motivi:

  • L'utilità di pianificazione l'ha sostituita usando un thread con priorità più alta.

  • Il quantum di esecuzione del thread è scaduto e altri thread erano pronti per l'esecuzione.

    Durante questo periodo, un thread è stato bloccato da un motivo di attesa del kernel che il Concurrency Visualizer considera come Preemption. I segmenti di preemption iniziano quando un thread viene spostato da un core logico e terminano quando il thread riprende l'esecuzione.

    La descrizione comando per un segmento preemptato visualizza il nome del processo o del thread che ha causato la preemption. Tuttavia, questo non implica che il processo o il thread che ha preso il controllo abbia effettivamente operato durante il periodo di preemzione.

Tempo di inattività

Questi segmenti nella tempistica sono associati al tempo di blocco categorizzato come Attesa. La categoria di inattività implica che un thread ha volontariamente rinunciato al suo nucleo logico e non sta svolgendo alcun lavoro. Durante questo periodo, un thread è stato bloccato in un'API che il visualizzatore di concorrenza conta come sospensione. API come Sleep() e SwitchToThread() rientrano in questo gruppo.

Ora di sincronizzazione

Questi segmenti nella sequenza temporale sono associati ai tempi di blocco classificati come Sincronizzazione. Quando un thread viene contrassegnato come bloccato per la sincronizzazione, una di queste operazioni è implicita:

  • L'esecuzione del thread potrebbe aver generato una chiamata a un'API di sincronizzazione thread nota, EnterCriticalSection() ad esempio o WaitForSingleObject().

  • L'algoritmo di corrispondenza api non può essere completamente completo e pertanto alcune API che potrebbero essere mappate ad altre categorie possono essere visualizzate anche come sincronizzazione perché un frame nello stack di chiamate ha raggiunto una primitiva di blocco del kernel sottostante mappata a questa categoria.

    Per comprendere la causa sottostante di un evento di blocco dei thread, esaminare attentamente gli stack di chiamate bloccanti e i report di profilo.

Tempo di elaborazione dell'interfaccia utente

Questi segmenti nella sequenza temporale sono associati ai tempi di blocco classificati come elaborazione dell'interfaccia utente. Ciò implica che un thread sta pompando messaggi di Windows o eseguendo altre operazioni dell'interfaccia utente. Durante questo periodo, un thread è stato bloccato in un'API che il Concurrency Visualizer conta come elaborazione UI. API come GetMessage() e MsgWaitForMultipleObjects() rientrano in questo gruppo.

Se non viene identificata alcuna API di blocco predefinita, esaminare gli stack di chiamate e i report del profilo per determinare le cause sottostanti del ritardo.

La categoria Elaborazione interfaccia utente consente di comprendere la velocità di risposta delle applicazioni GUI ed è consigliabile nelle applicazioni che dipendono dalla velocità di risposta dell'interfaccia utente. Ad esempio, se il thread dell'interfaccia utente in un'applicazione raggiunge 100% tempo nell'elaborazione dell'interfaccia utente, è probabilmente reattivo. Tuttavia, se il thread dell'interfaccia utente impiega molto tempo in altre categorie, cercare le cause principali e prendere in considerazione le opzioni per ridurre le categorie non relative all'interfaccia utente in tale thread.