Comment obtenir le temps total d’inactivité du processeur dans Objective C / C sous OS X?

Je dois obtenir le temps total d’inactivité du processeur en Objective C / C sous OS X?

Si possible, veuillez fournir un exemple de code pour cela. Voici un code que j’utilise pour obtenir ces mésortingques. En tant que résultat, le pourcentage n’est pas identique à celui que j’ai dans Activity Monitor. Donc, je suppose que le calcul du temps de calcul est incorrect:

#include  #include  #include  #include  #include  - (void)printCPUUsage { processor_cpu_load_info_t cpuLoad; mach_msg_type_number_t processorMsgCount; natural_t processorCount; uint64_t totalSystemTime = 0, totalUserTime = 0, totalIdleTime = 0, totalCPUTime = 0; kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &processorCount, (processor_info_array_t *)&cpuLoad, &processorMsgCount); for (natural_t i = 0; i < processorCount; i++) { // Calc load types and totals, with guards against 32-bit overflow // (values are natural_t) uint64_t system = 0, user = 0, idle = 0, total = 0; system = cpuLoad[i].cpu_ticks[CPU_STATE_SYSTEM]; user = cpuLoad[i].cpu_ticks[CPU_STATE_USER]; idle = cpuLoad[i].cpu_ticks[CPU_STATE_IDLE]; total = system + user + idle; if (total < 1) { total = 1; } totalCPUTime += total; totalSystemTime += system; totalUserTime += user; totalIdleTime += idle; } double onePercent = totalCPUTime/100.0f; NSLog(@"system: %f", (double)totalSystemTime/(double)onePercent); NSLog(@"user: %f", (double)totalUserTime/(double)onePercent); NSLog(@"idle: %f", (double)totalIdleTime/(double)onePercent); } 

Les valeurs renvoyées par le compteur de processus ou par le haut sont, par défaut, basées sur un échantillon, c’est-à-dire qu’elles calculent l’utilisation du processeur depuis l’échantillon précédent, plutôt que les valeurs absolues.

Ceci correspond à l’option -cn to top quand elle est appelée dans le mode:

  top -cn -l 0 | head -5 

Quel est le mode par défaut. Si vous voulez les valeurs retournées dans votre code, vous devez alors baser les valeurs sur des échantillons immédiats, en utilisant:

  top -ce -l 0 | head -5 

Ces valeurs correspondront aux valeurs que vous voyez.

Si vous souhaitez obtenir des valeurs similaires à celles du compteur / sumt de processus, vous devez prélever deux échantillons et afficher les valeurs des différences entre eux.

Ainsi, par exemple, nous créons une structure contenant les statistiques:

 struct cpusample { uint64_t totalSystemTime; uint64_t totalUserTime; uint64_t totalIdleTime; }; 

nous modifions l’appel printCPUUsage afin qu’il effectue un exemple:

 void sample(struct cpusample *sample) { processor_cpu_load_info_t cpuLoad; mach_msg_type_number_t processorMsgCount; natural_t processorCount; uint64_t totalSystemTime = 0, totalUserTime = 0, totalIdleTime = 0; kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &processorCount, (processor_info_array_t *)&cpuLoad, &processorMsgCount); for (natural_t i = 0; i < processorCount; i++) { // Calc load types and totals, with guards against 32-bit overflow // (values are natural_t) uint64_t system = 0, user = 0, idle = 0; system = cpuLoad[i].cpu_ticks[CPU_STATE_SYSTEM]; user = cpuLoad[i].cpu_ticks[CPU_STATE_USER] + cpuLoad[i].cpu_ticks[CPU_STATE_NICE]; idle = cpuLoad[i].cpu_ticks[CPU_STATE_IDLE]; totalSystemTime += system; totalUserTime += user; totalIdleTime += idle; } sample->totalSystemTime = totalSystemTime; sample->totalUserTime = totalUserTime; sample->totalIdleTime = totalIdleTime; } 

Ensuite, nous prenons deux échantillons (1 seconde entre les échantillons):

 struct cpusample delta; sample(&sample1); sleep(1); sample(&sample2); deltasample.totalSystemTime = sample2.totalSystemTime - sample1.totalSystemTime; deltasample.totalUserTime = sample2.totalUserTime - sample1.totalUserTime; deltasample.totalIdleTime = sample2.totalIdleTime - sample1.totalIdleTime; 

Ajouter un code d’imprécision:

 void printSample(struct cpusample *sample) { uint64_t total = sample->totalSystemTime + sample->totalUserTime + sample->totalIdleTime; double onePercent = total/100.0f; NSLog(@"system: %f", (double)sample->totalSystemTime/(double)onePercent); NSLog(@"user: %f", (double)sample->totalUserTime/(double)onePercent); NSLog(@"idle: %f", (double)sample->totalIdleTime/(double)onePercent); } 

Ainsi, lorsque vous printSample(&deltasample) il enregistre l’enregistrement delta, ce qui donne une valeur beaucoup plus similaire à celle présentée par top ou Activity Monitor .

Mais pour être honnête, j’utiliserais host_statistics , car le code est plus propre:

 void sample(struct cpusample *sample) { kern_return_t kr; mach_msg_type_number_t count; host_cpu_load_info_data_t r_load; uint64_t totalSystemTime = 0, totalUserTime = 0, totalIdleTime = 0; count = HOST_CPU_LOAD_INFO_COUNT; kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (int *)&r_load, &count); if (kr != KERN_SUCCESS) { printf("oops: %s\n", mach_error_ssortingng(kr)); return; } sample->totalSystemTime = r_load.cpu_ticks[CPU_STATE_SYSTEM]; sample->totalUserTime = r_load.cpu_ticks[CPU_STATE_USER] + r_load.cpu_ticks[CPU_STATE_NICE]; sample->totalIdleTime = r_load.cpu_ticks[CPU_STATE_IDLE]; }