Saltar al contenido

¿Qué significan ‘real’, ‘usuario’ y ‘sys’ en la salida del tiempo (1)?

Si encuentras algún error en tu código o trabajo, recuerda probar siempre en un entorno de testing antes subir el código al trabajo final.

Solución:

Estadísticas de tiempo de proceso real, de usuario y del sistema

Una de estas cosas no es como la otra. Real se refiere al tiempo real transcurrido; El usuario y el sistema se refieren al tiempo de CPU utilizado solo por el proceso.

  • Verdadero es la hora del reloj de pared: tiempo desde el inicio hasta el final de la llamada. Todo esto es 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 a 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 de el proceso. Este es solo el tiempo real de la CPU utilizado para ejecutar el proceso. Otros procesos y el tiempo que el proceso pasa bloqueado no cuentan para esta cifra.

  • Sys es la cantidad de tiempo de CPU invertido en el kernel dentro del proceso. Esto significa ejecutar el tiempo de CPU invertido en llamadas al sistema. dentro del kernel, a diferencia del código de la biblioteca, que todavía se ejecuta 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 kernel (también conocido como modo ‘supervisor’) y el mecanismo de llamada del sistema.

User+Sys le dirá cuánto tiempo real de CPU usó su proceso. Tenga en cuenta que esto se aplica a 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), podría exceder potencialmente el tiempo del reloj de pared informado por Real (que suele ocurrir). Tenga en cuenta que en la salida estas cifras incluyen el User y Sys tiempo de todos los procesos hijo (y sus descendientes), así como cuando podrían haber sido recopilados, por ejemplo, por wait(2) o waitpid(2), aunque las llamadas al sistema subyacente devuelven las 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 wait (2) (POSIX) o times (2) (POSIX), dependiendo del sistema en particular. ‘Real’ se calcula a partir de una hora de inicio y finalización recopilada de la gettimeofday (2) llama. Dependiendo de la versión del sistema, varias otras estadísticas, como el número de cambios de contexto, también pueden ser recopiladas por time.

En una máquina multiprocesador, un proceso de múltiples subprocesos o un proceso que bifurca a los niños podría tener un tiempo transcurrido menor que el tiempo total de la CPU, ya que diferentes subprocesos o procesos pueden ejecutarse en paralelo. Además, las estadísticas de tiempo informadas 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 muestra el ejemplo del póster original.

Una breve introducción al modo Kernel frente al modo de usuario

En Unix, o 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, el código en modo de usuario no puede hacer esto (con una buena razón), aunque puede solicitar memoria compartida del kernel, que podría ser leído o escrito por más de un proceso. En este caso, la memoria compartida se solicita explícitamente al kernel a través de un mecanismo seguro y ambos procesos deben adjuntarse explícitamente a ella para poder utilizarla.

El modo privilegiado generalmente se conoce como 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 trampa) que cambia la CPU para que se ejecute en modo kernel y ejecuta código desde una ubicación específica 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 en las que no se puede escribir a menos que la CPU se esté ejecutando en modo supervisor. Trampa con un número de trampa explícito y la dirección se busca en la tabla de salto; el núcleo tiene un número finito de puntos de entrada controlados.

Las llamadas al ‘sistema’ en la biblioteca C (particularmente las 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 del sistema al kernel para realizar servicios específicos como E / S, pero también tienen código ejecutándose en modo de usuario. También es muy posible emitir directamente una trampa al modo kernel desde cualquier código de espacio de usuario si lo desea, aunque es posible que deba escribir un fragmento de lenguaje ensamblador para configurar los registros correctamente para la llamada.

Más sobre ‘sys’

Hay cosas que su código no puede hacer desde el modo de usuario, como asignar memoria o acceder al hardware (HDD, red, etc.). Estos están bajo la supervisión del kernel y solo él puede hacerlos. Algunas operaciones como malloc ofread/fwrite invocará estas funciones del kernel y eso contará como tiempo de ‘sys’. Desafortunadamente, no es tan simple como “cada llamada a malloc se contará en el tiempo de ‘sys'”. La llamada a malloc hará algún procesamiento por sí mismo (aún contado en el tiempo del ‘usuario’) y luego en algún punto del camino puede llamar a la función en el kernel (contado en el tiempo de ‘sys’). Después de regresar de la llamada al 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 modo kernel … no se puede decir. Depende de la implementación de la biblioteca. Además, otras funciones aparentemente inocentes también podrían usar malloc y similares en segundo plano, que de nuevo tendrán algún tiempo en ‘sys’ entonces.

Para ampliar la respuesta aceptada, solo quería proporcionar otra razón por la que realuser + sys.

Manten eso en mente real representa el tiempo real transcurrido, mientras que user y sys los valores representan el tiempo de ejecución de la CPU. Como resultado, en un sistema multinúcleo, el user y / o sys el tiempo (así como su suma) puede realmente 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

verdadero: El tiempo real empleado en ejecutar el proceso de principio a fin, como si lo hubiera medido un humano con un cronómetro.

usuario: El tiempo acumulado empleado por todas las CPU durante el cálculo

sys: El tiempo acumulado empleado por 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 más grande que real, ya que varios procesadores pueden funcionar en paralelo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *