unix - usar - ¿Qué significa ''real'', ''usuario'' y ''sys'' en la salida del tiempo(1)?
para que sirve el comando date (4)
$ time foo
real 0m0.003s
user 0m0.000s
sys 0m0.004s
$
¿Qué significa ''real'', ''usuario'' y ''sys'' en la salida del tiempo?
¿Cuál es significativo al comparar mi aplicación?
• real : el tiempo real empleado en ejecutar el proceso de principio a fin, como si lo midiera un humano con un cronómetro
• usuario : el tiempo acumulado gastado por todas las CPU durante el cálculo
• sys : el tiempo acumulado que pasan todas las CPU durante las tareas relacionadas con el sistema, como la asignación de memoria.
Tenga en cuenta que a veces user + sys puede ser mayor que real, ya que varios procesadores pueden funcionar en paralelo.
Para ampliar la respuesta aceptada , solo quería proporcionar otra razón por real
cual ≠ user
+ sys
real
.
Tenga en cuenta que real
representa el tiempo transcurrido real, mientras que user
valores de user
y de sys
representan el tiempo de ejecución de la CPU. Como resultado, en un sistema multinúcleo, el tiempo del user
y / o del sys
(así como su suma) puede exceder el tiempo real. Por ejemplo, en una aplicación Java que estoy ejecutando para la clase, obtengo este conjunto de valores:
real 1m47.363s
user 2m41.318s
sys 0m4.013s
Real muestra el tiempo total de vuelta para un proceso; ¡mientras que el usuario muestra el tiempo de ejecución para las instrucciones definidas por el usuario y Sys es el tiempo para ejecutar llamadas al sistema!
El tiempo real también incluye el tiempo de espera (el tiempo de espera para E / S, etc.)
Estadísticas de tiempo de proceso real, usuario y sistema
Una de estas cosas no es como la otra. Real se refiere al tiempo transcurrido real; Usuario y Sys se refieren al tiempo de CPU utilizado solo por el proceso.
Real es la hora del reloj de pared - hora desde el inicio hasta el final de la llamada. Esto es todo el tiempo transcurrido, incluidos los intervalos de tiempo utilizados por otros procesos y el tiempo que el proceso pasa bloqueado (por ejemplo, si está esperando que se complete la E / S).
Usuario es la cantidad de tiempo de CPU empleado en el código de modo de usuario (fuera del kernel) dentro del proceso. Este es solo el tiempo de CPU real utilizado en la ejecución del proceso. Otros procesos y el tiempo que el proceso pasa bloqueado no cuentan para esta cifra.
Sys es la cantidad de tiempo de CPU empleado en el kernel dentro del proceso. Esto significa ejecutar el tiempo de CPU empleado en las llamadas del sistema dentro del kernel, a diferencia del código de biblioteca, que todavía se está ejecutando en el espacio de usuario. Como ''usuario'', este es solo el tiempo de CPU utilizado por el proceso. Vea a continuación una breve descripción del modo de kernel (también conocido como modo ''supervisor'') y el mecanismo de llamada del sistema.
User+Sys
le dirá cuánto tiempo de CPU real utilizó su proceso. Tenga en cuenta que esto se realiza en todas las CPU, por lo que si el proceso tiene varios subprocesos (y este proceso se ejecuta en una computadora con más de un procesador), posiblemente podría exceder el tiempo de reloj de pared informado por Real
(lo que generalmente ocurre). Tenga en cuenta que en la salida, estas cifras incluyen el tiempo de User
y Sys
de todos los procesos secundarios (y sus descendientes), así como cuando podrían haberse recopilado, por ejemplo, por wait(2)
o waitpid(2)
, aunque las llamadas al sistema subyacente devuelven el Estadísticas del proceso y sus hijos por separado.
Orígenes de las estadísticas reportadas por time (1)
Las estadísticas reportadas por time
se recopilan de varias llamadas al sistema. ''Usuario'' y ''Sys'' provienen de la wait (2)
o times (2)
, dependiendo del sistema en particular. "Real" se calcula a partir de una hora de inicio y finalización obtenida de la llamada gettimeofday (2)
. Dependiendo de la versión del sistema, varias otras estadísticas, como el número de cambios de contexto, también se pueden recopilar por time
.
En una máquina multiprocesador, un proceso de subprocesos múltiples o un proceso de procesamiento de elementos secundarios podría tener un tiempo transcurrido menor que el tiempo total de la CPU, ya que diferentes procesos o subprocesos pueden ejecutarse en paralelo. Además, las estadísticas de tiempo reportadas provienen de diferentes orígenes, por lo que los tiempos registrados para tareas de ejecución muy corta pueden estar sujetos a errores de redondeo, como lo muestra el ejemplo del póster original.
Una breve introducción al modo Kernel vs. User.
En Unix, o en cualquier sistema operativo de memoria protegida, el modo ''Kernel'' o ''Supervisor'' se refiere a un modo privilegiado en el que la CPU puede operar. Ciertas acciones privilegiadas que podrían afectar la seguridad o la estabilidad solo se pueden realizar cuando la CPU está operando en este modo; estas acciones no están disponibles para el código de la aplicación. Un ejemplo de tal acción podría ser la manipulación de la MMU para obtener acceso al espacio de direcciones de otro proceso. Normalmente, user-mode código de user-mode no puede hacer esto (por una buena razón), aunque puede solicitar memoria compartida del kernel, que puede ser leída o escrita por más de un proceso. En este caso, la memoria compartida se solicita explícitamente desde el kernel a través de un mecanismo seguro y ambos procesos deben adjuntarse explícitamente a ella para poder usarla.
El modo privilegiado se suele denominar modo ''kernel'' porque el kernel es ejecutado por la CPU que se ejecuta en este modo. Para cambiar al modo kernel, debe emitir una instrucción específica (a menudo llamada trap ) que hace que la CPU se ejecute en modo kernel y ejecute código desde una ubicación específica que se encuentra en una tabla de salto. Por razones de seguridad, no puede cambiar al modo kernel y ejecutar código arbitrario; las trampas se administran a través de una tabla de direcciones que no se pueden escribir a menos que la CPU se esté ejecutando en modo supervisor. Se captura con un número de captura explícito y la dirección se busca en la tabla de salto; El kernel tiene un número finito de puntos de entrada controlados.
Las llamadas del ''sistema'' en la biblioteca de C (particularmente aquellas descritas en la Sección 2 de las páginas del manual) tienen un componente de modo de usuario, que es lo que realmente llama desde su programa C. Detrás de escena, pueden emitir una o más llamadas de sistema al kernel para realizar servicios específicos como I / O, pero aún tienen código que se ejecuta en modo de usuario. También es bastante posible emitir directamente una captura al modo kernel desde cualquier código de espacio de usuario, si así lo desea, aunque es posible que deba escribir un fragmento de lenguaje ensamblador para configurar los registros correctamente para la llamada. here. puede encontrar una página que describe las llamadas al sistema proporcionadas por el kernel de Linux y las convenciones para configurar registros here.
Más sobre ''sys''
Hay cosas que su código no puede hacer desde el modo de usuario, como asignar memoria o acceder a hardware (HDD, red, etc.). Estos están bajo la supervisión del núcleo, y solo ellos pueden hacerlo. Algunas operaciones que realiza (como malloc
o fread
/ fwrite
) invocarán estas funciones del Kernel y que luego contarán como tiempo ''sys''. Desafortunadamente, no es tan simple como que "cada llamada a malloc se contará en tiempo de ''sistema''". La llamada a malloc
hará un procesamiento propio (aún contado en tiempo de ''usuario'') y luego, en algún momento, puede llamar a la función en el kernel (contado en tiempo de ''sys''). Después de regresar de la llamada del kernel, habrá más tiempo en ''usuario'' y luego malloc
volverá a su código. En cuanto a cuándo ocurre el cambio y cuánto se gasta en el modo kernel ... no se puede decir. Depende de la implementación de la biblioteca. Además, otras funciones aparentemente inocentes también pueden usar malloc
y similares en el fondo, que luego tendrá algo de tiempo en ''sys''.