El tiempo de CPU (o tiempo de proceso ) es la cantidad de tiempo que una unidad central de procesamiento (CPU) se utilizó para procesar instrucciones de un programa informático o sistema operativo . El tiempo de CPU se mide en ticks de reloj o segundos. A veces es útil convertir el tiempo de CPU en un porcentaje de la capacidad de la CPU, lo que da como resultado el uso de la CPU .
Medir el tiempo de CPU de dos programas funcionalmente idénticos que procesan entradas idénticas puede indicar qué programa es más rápido, pero es un error común pensar que el tiempo de CPU se puede utilizar para comparar algoritmos . Comparar programas por su tiempo de CPU compara implementaciones específicas de algoritmos. (Es posible tener implementaciones eficientes e ineficientes del mismo algoritmo). Los algoritmos se comparan más comúnmente utilizando medidas de complejidad temporal y complejidad espacial .
Por lo general, el tiempo de CPU que utiliza un programa lo mide el sistema operativo, que programa todo el trabajo de la CPU. Los sistemas operativos multitarea modernos ejecutan cientos de procesos. (Un proceso es un programa en ejecución). Al iniciar un proceso, el sistema operativo registra el tiempo mediante un temporizador interno. Cuando el proceso se suspende o finaliza, el sistema operativo vuelve a registrar el tiempo. El tiempo total que un proceso pasó ejecutándose es su tiempo de CPU, como se muestra en la figura.
El "registro" de procesos que lleva a cabo la familia de sistemas operativos Unix incluye dos componentes: el tiempo de CPU . El tiempo de usuario y el tiempo de sistema reflejan el hecho de que la mayoría de los programas realizan solicitudes al sistema operativo mientras se ejecutan. Las operaciones de entrada/salida , como leer un archivo o escribir en la pantalla, se realizan mediante la emisión de solicitudes al sistema operativo, posiblemente a través de llamadas al sistema . La E/S y otras operaciones realizadas por el sistema operativo en nombre de un proceso constituyen el tiempo del sistema.
Por el contrario, el tiempo real transcurrido (o simplemente tiempo real, o tiempo de reloj de pared ) es el tiempo transcurrido desde el inicio de un programa de computadora hasta el final medido por un reloj común. El tiempo real transcurrido incluye el tiempo del usuario, el tiempo del sistema y el tiempo en que el proceso no se estaba ejecutando por alguna razón, como cuando se interrumpió su ejecución.
El comando top de Unix proporciona el tiempo de CPU, la prioridad, el tiempo real transcurrido y otra información para todos los procesos y la actualiza en tiempo real.
El comando Unix time imprime el tiempo de CPU y el tiempo real transcurrido para la ejecución de un comando Unix (o pipeline ). Tenga en cuenta que muchos shells de línea de comandos tienen su propia implementación de este comando. Para ejecutar el programa Unix time
, proporcionamos su ruta completa /usr/bin/time
:
$ gcc nextPrimeNumber.c -o nextPrimeNumber $ /usr/bin/time ./nextPrimeNumber 30000007 El número primo mayor que 30000007 es 30000023 0.08 real 0.02 usuario 0.00 sys $
Este proceso tomó un total de 0,02 segundos de tiempo de CPU (usuario + sistema). El tiempo de sistema informado es de 0,00 segundos, lo que indica que la cantidad de tiempo de sistema utilizado fue menor que la resolución impresa de 0,01 segundos. El tiempo real transcurrido fue de 0,08 segundos.
El siguiente es el código fuente de la aplicación nextPrimeNumber que se utilizó en el ejemplo anterior.
// siguienteNumeroPrimo.c #include <stdio.h> #include <stdlib.h> int isPrimeNumber ( unsigned long int n ) { para ( int i = 2 ; i <= ( n >> 1 ); ++ i ) si ( n % i == 0 ) devuelve 0 ; devuelve 1 ; } int main ( int argc , char * argv []) { unsigned long int argumento = strtoul ( argv [ 1 ], NULL , 10 ), n = argumento ; mientras ( ! esNumeroPrimo ( ++ n )); printf ( "El número primo mayor que %lu es %lu \n " , argumento , n ); devolver 0 ; }
Las CPU modernas tienen varios relojes y contadores, como el contador de sello de tiempo , el temporizador de eventos de alta precisión y el reloj de tiempo real , cada uno con un uso especializado. Cuando un programa quiere cronometrar su propia operación, puede usar una función como la función POSIX clock()
, que devuelve el tiempo de CPU utilizado por el programa. POSIX permite que este reloj comience en un valor arbitrario, por lo que para medir el tiempo transcurrido, un programa llama a clock()
, realiza algún trabajo y luego clock()
vuelve a llamar. [1] La diferencia es el tiempo necesario para realizar el trabajo.
La función POSIX getrusage()
devuelve más que solo el tiempo de CPU consumido por un proceso en un entorno POSIX. Devuelve muchas mediciones de un proceso, que a menudo incluyen el uso aproximado de la memoria y los recuentos de eventos de cambio de contexto (programación). La funcionalidad varía según los sistemas operativos.
En máquinas con múltiples procesadores y núcleos , un programa puede utilizar dos o más procesadores simultáneamente en lo que se denomina procesamiento en paralelo . En tales situaciones, resulta útil una medida del tiempo total de CPU , que es la suma del tiempo de CPU consumido por todos los procesadores utilizados por el programa.
El tiempo real transcurrido siempre es mayor o igual que el tiempo de CPU para los programas informáticos que utilizan solo una CPU para el procesamiento. Si no se produce ninguna espera, como en el caso de la E/S, y nunca se interrumpe la ejecución del programa, el tiempo real transcurrido y el tiempo de CPU serán prácticamente idénticos.
Si un programa utiliza procesamiento en paralelo , el tiempo total de CPU para ese programa suele ser mayor que el tiempo real transcurrido. Para un programa que puede dividir su trabajo de manera uniforme entre dos procesadores sin sobrecarga al hacerlo, el valor (tiempo total de CPU)/(número de procesadores) será prácticamente idéntico al tiempo real transcurrido. En este caso, un procesador puede ser una CPU (de un solo núcleo) o un núcleo en una CPU de varios núcleos .
Ejemplo: una aplicación de software ejecutada en un procesador de cuatro núcleos crea cuatro procesos Unix. Si cada proceso puede ejecutarse en un núcleo de procesador independiente, el cálculo se realiza en cuatro núcleos de procesador simultáneamente. El tiempo total de CPU sería, idealmente, cuatro veces el tiempo real transcurrido.
En realidad, el procesamiento en paralelo rara vez alcanza una aceleración lineal, en la que la cantidad de cómputo por unidad de tiempo aumenta con la cantidad de procesadores en uso. Algunos problemas vergonzosamente paralelos admiten tales soluciones, pero para la mayoría, se requiere trabajo adicional para dividir el cómputo cuando se inicia el programa y combinar los resultados de cada procesador al final. El trabajo adicional se suma al tiempo total de CPU. Con frecuencia, un proceso se encuentra esperando datos de otro proceso antes de poder continuar, lo que también se suma al tiempo total.