c ++ - Få antallet af processorer en bestemt proces kører på

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har processID forbundet med en proces. Jeg har oprettet denne proces ved hjælp af funktionen CreateProcess(). I løbet af det vil jeg spore, hvor mange processorer det kører på, og hvor lang tid denne eksekverbare har brugt på multicore-maskiner.


Jeg vil skrive C ++ kode for det samme; kan nogen hjælpe mig med dette?


Jeg bruger Win XP multicore maskiner.

Bedste reference


GetProcessAffinityMask: [4]



  Henter procesaffinitetsmasken til den angivne proces og systemaffinitetsmasken til systemet.



GetProcessTimes: [5]



  Henter timing information for den angivne proces.


Andre referencer 1


Du kan fange dette detaljeringsniveau på Vista eller senere ved hjælp af Event Tracing for Windows (ETW) og CSwitch-hændelsen (som udsendes på hver kontekstomskifter).


Forskellige værktøjer (f.eks. Windows Performance Toolkit) indfanger og visualiserer disse data. [6]


Dette understøttes dog ikke på Windows XP.


Hvis du bare vil vide, hvad din typiske samtidighed er (dvs. hvor mange af dine tråde kører på et givet tidspunkt), kan du jævnligt prøve Prøve-dataene (fra HKEY\_PERFORMANCE\_DATA). Tælleren 'Trådstat' vil give dig øjeblikkelig tilstand for hver tråd i din proces (dvs. om hver tråd kører eller ej). Denne prøvetagningsproces vil naturligvis begrænse den maksimale samtidighed til (antal processorer - 1).


Men har du virkelig brug for denne meget detaljer? GetProcessTimes er normalt nok.


Opdater


Du kan køre din app på en testmaskine og blot måle udnyttelsen af ​​hver CPU ved hjælp af perfmon. Du skal også måle CPU-udnyttelsen af ​​hver proces for at sikre, at intet andet kører uventet.


Hvis du vil indsamle data for en rapport, skal du køre perfmon som administrator.



  • Naviger til 'Performance Monitor' på højre side for at vise real-time performance diagrammet. Vælg de objekter/tellere, du vil overvåge (dvs. '\% Processortid' for alle processorer og processer). Perfmon bør begynde at fange dataene i realtid.

  • Højreklik på grafen og vælg optagelsesfrekvensen (fx hvis din app kører i timer, vil du sandsynligvis ikke have data hvert sekund).

  • Højreklik på 'Performance Monitor' node i højre hånd og vælg 'Nyt | Data Collector Set'. Indtast et navn for det og klik på de andre standardindstillinger.

  • Naviger til dit Data Collector Set til højre (under 'Data Collector Sets | User Defined'). Du kan starte og stoppe dataindsamling ved hjælp af knapperne på værktøjslinjen (eller ved at højreklikke).

  • Nu har du nogle data tilbage til præstationsmonitorgrafen og vælg 'Se logdata' (den anden værktøjslinjeknap). Vælg din logfil fra fanen Kilde. Dette viser en graf over dine indfangede data.

  • Højreklik på grafen og vælg 'Gem data som ...' Du kan vælge CSV eller TSV.



Og det er det.