ver uso temperatura reparar procesos liberar esta como bajar alto activos algorithm performance cpu cpu-usage cpu-architecture

algorithm - temperatura - uso de cpu 100 windows 7



¿Cómo se calcula el uso de la CPU? (8)

En mi escritorio, tengo un pequeño widget que me dice el uso actual de mi CPU. También muestra el uso de cada uno de mis dos núcleos.

Siempre me pregunté, ¿cómo calcula la CPU la cantidad de potencia de procesamiento que se está utilizando? Además, si la CPU se cuelga haciendo algunos cálculos intensos, ¿cómo puede (o lo que sea que maneje esta actividad) examinar el uso, sin colgarse también?


  1. La CPU no se cuelga, simplemente está funcionando a la capacidad máxima, lo que significa que está procesando tantas instrucciones como capacidades físicas por segundo. El proceso que calcula el uso de la CPU es algunas de esas instrucciones. Si las aplicaciones intentan hacer operaciones más rápido de lo que la CPU es capaz, entonces simplemente se retrasarán, por lo tanto, se colgará.

  2. El cálculo de la utilización de la CPU se basa en la utilización total disponible. Entonces, si una CPU tiene dos núcleos, y un núcleo tiene un 30% de uso, y el otro es un 60%, la utilización general es del 45%. También puede ver el uso de cada núcleo individual.


Bueno, por lo que yo entiendo, hay un gigante

while(true){}

lazo que los sistemas operativos hacen girar. Su proceso se gestiona desde ese bucle. Permite que el código externo se ejecute directamente en el procesador en fragmentos. Sin exagerar demasiado, esta es una súper simplificación de lo que realmente está sucediendo.


Esta es mi comprensión básica de tener un poco de exposición a un código similar. Programas como el Administrador de tareas o su sistema de acceso a widgets llama a NtQuerySystemInformation () y usa la información recopilada del SO para hacer el cálculo simple del porcentaje de tiempo que una CPU está inactiva o en uso (en un período de tiempo estándar). Una CPU sabe cuándo está inactiva, por lo que puede determinar cuándo no está inactiva. Estos programas pueden llegar a obstruirse ... el administrador de tareas de mi computadora portátil se congela todo el tiempo cuando se calcula el uso de la CPU cuando está llegando al 100%.

Un buen ejemplo de código de ejemplo se puede encontrar en el sitio web de MSDN que muestra las llamadas a funciones para calcular el uso de CPU para un conjunto de instrucciones: http://msdn.microsoft.com/en-us/library/aa364157(VS.85).aspx

Lo que estas llamadas al sistema hacen es acceder al código del kernel, creo ... que está más allá del alcance de mi comprensión.


Hay una tarea especial llamada la tarea inactiva que se ejecuta cuando no se puede ejecutar ninguna otra tarea. El% de uso es solo el porcentaje del tiempo que no estamos ejecutando la tarea inactiva. El sistema operativo mantendrá un total acumulado del tiempo dedicado a ejecutar la tarea inactiva:

  • cuando cambiamos a la tarea inactiva, establece t = hora actual
  • cuando nos alejamos de la tarea inactiva, agregue (tiempo actual - t) al total acumulado

Si tomamos dos muestras del total acumulado n segundos separados, podemos calcular el porcentaje de esos n segundos gastados ejecutando la tarea inactiva como (segunda muestra - primera muestra) / n

Tenga en cuenta que esto es algo que hace el sistema operativo, no la CPU. ¡El concepto de una tarea no existe en el nivel de la CPU! (En la práctica, la tarea inactiva pondrá al procesador a dormir con una instrucción HLT, por lo que la CPU sabe cuándo no se está utilizando)

En cuanto a la segunda pregunta, los sistemas operativos modernos son multitarea preventiva, lo que significa que el SO puede alejarse de su tarea en cualquier momento. ¿De qué manera el sistema operativo realmente roba la CPU de su tarea? Interrupciones: http://en.wikipedia.org/wiki/Interrupt


La CPU no hace los cálculos de uso por sí misma. Puede tener funciones de hardware para facilitar esa tarea, pero es principalmente el trabajo del sistema operativo. Entonces, obviamente, los detalles de las implementaciones variarán (especialmente en el caso de sistemas multinúcleo).

La idea general es ver cuánto tiempo hace cola la CPU. El sistema operativo puede echar un vistazo al programador periódicamente para determinar el número de cosas que tiene que hacer.

Esta es una función de Linux en (arrancada de Wikipedia) que realiza dicho cálculo :

#define FSHIFT 11 /* nr of bits of precision */ #define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */ #define LOAD_FREQ (5*HZ) /* 5 sec intervals */ #define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */ #define EXP_5 2014 /* 1/exp(5sec/5min) */ #define EXP_15 2037 /* 1/exp(5sec/15min) */ #define CALC_LOAD(load,exp,n) / load *= exp; / load += n*(FIXED_1-exp); / load >>= FSHIFT; unsigned long avenrun[3]; static inline void calc_load(unsigned long ticks) { unsigned long active_tasks; /* fixed-point */ static int count = LOAD_FREQ; count -= ticks; if (count < 0) { count += LOAD_FREQ; active_tasks = count_active_tasks(); CALC_LOAD(avenrun[0], EXP_1, active_tasks); CALC_LOAD(avenrun[1], EXP_5, active_tasks); CALC_LOAD(avenrun[2], EXP_15, active_tasks); } }

En cuanto a la segunda parte de su pregunta, la mayoría de los sistemas operativos modernos son multi-tasked . Eso significa que el sistema operativo no permitirá que los programas ocupen todo el tiempo de procesamiento y no tengan ninguno para sí mismos (a menos que lo haga) . En otras palabras, incluso si una aplicación parece colgada, el sistema operativo aún puede robar algo de tiempo para su propio trabajo.


Para obtener el uso de la CPU, muestree periódicamente el tiempo total del proceso y encuentre la diferencia.

Por ejemplo, si estos son los tiempos de CPU para el proceso 1:

kernel: 1:00:00.0000 user: 9:00:00.0000

Y luego los obtienes nuevamente dos segundos después, y son:

kernel: 1:00:00.0300 user: 9:00:00.6100

Se restan los tiempos del kernel (para una diferencia de 0.03 ) y los tiempos del usuario ( 0.61 ), se los agrega ( 0.64 ) y se dividen por el tiempo de muestra de 2 segundos ( 0.32 ).

Entonces, en los últimos dos segundos, el proceso usó un promedio de 32% de tiempo de CPU.

Las llamadas de sistema específicas necesarias para obtener esta información son (obviamente) diferentes en cada plataforma. En Windows, puede usar GetProcessTimes o GetSystemTimes si desea un acceso directo al tiempo total de CPU utilizado o inactivo.


Una forma de hacerlo es la siguiente:

Elija un intervalo de muestreo, por ejemplo, cada 5 minutos (300 segundos) de tiempo real transcurrido. Puedes obtener esto de gettimeofday .

Obtén el tiempo de proceso que has usado en esos 300 segundos. Puede usar la llamada a times() para obtener esto. Ese sería el new_process_time - old_process_time , donde old_process_time es la hora del proceso que guardó desde el último intervalo de tiempo.

Por lo tanto, su porcentaje de CPU es (process_time/elapsed_time)*100.0 Puede configurar una alarma que le (process_time/elapsed_time)*100.0 cada 300 segundos para hacer estos cálculos.

Tengo un proceso que no quiero usar más que un determinado porcentaje de CPU objetivo. Este método funciona bastante bien y está de acuerdo con mi monitor de sistema. Si estamos usando demasiada CPU, dormimos un poco.