Linux

[Linux] time 명령어

H/W engineer_ beginner 2022. 1. 20. 17:35
SMALL

 

 


 

 

리눅스에서는 특정 프로그램의 실행시간 측정을 위하여 time 명령어를 자주 사용합니다.

 

 

명령어 입력 시 'real', 'user', 'sys'로 통칭되는 3가지의 정보가 출력되는데 각 time이 의미하는 바는 서로 상이합니다. 

따라서 프로그램의 time 측정 시 각 시간이 의미하는 바를 명확하게 이해하고 사용해야 합니다.

 

 

 

 

Real :

 Actual elapsed time(실제 경과 시간)으로 wall clock time으로 불립니다. 이는 순수하게 측정된 전체 실행시간을 의미하므로 환경과 상황에 따른 변수가 작용할 수 있어 이론적 예측이 어렵습니다. 이는 call 을 실행한 순간부터 마치는 순간 까지를 의미하며 여러 프로세스들이 실행되는 시간과 프로세스들이 블락되는 시간을 포함합니다. ( I/O을 위해 대기하는 시간 등 )

 

User :

 프로세스 내부의 user-mode code가 실행되는데에 걸린 CPU time입니다. 이는 Kernel 밖에서 실행되는 시간이며 실제 프로세스가 실행되는데 걸린 CPU time을 의미합니다. ( 연산이 진행되는 동안 CPU가 소비한 누적 시간의 합 ) user time에는 프로세스가 블락되어 대기하는 시간은 포함되지 않습니다. 따라서 테스크가 실제로 연산되는 시간 외의 대기 시간은 User 시간에 포함되지 않습니다. 정리해보자면 user time은 명령어를 실제로 실행하여 연산한 시간의 총 합입니다.

 

Sys :

 프로세스 내부의 커널에서 실행된 CPU time의 결과입니다. 이 시간은 user-mode에서 실행되는 라이브러리 코드와는 달리 Kernel 내부에서 system call에 사용된 CPU time만을 의미합니다. 예를 들어 메모리 할당과 같은 시스템 관련 작업 동안 CPU가 소비한 누적 시간 입니다. sys time의 경우 단일 프로세스라면 real time과 동일하겠지만, 멀티 프로세스로 작업이 처리되는 경우 프로세스들이 데이터 엑세스를 위해 경쟁하기 때문에 단일 프로세스의 경우보다 더 늘어나게 됩니다. 정리하자면, Sys time은 실행 중인 명령어를 지원하기 위해 시스템 차원에서 이루어지는 메모리 할당 및 파일 I/O등의 작업을 처리하기 위해 Kernel 단에서 실행되는 시간의 총 합입니다.

 

 

 


 

 

 

* User + Sys time : 프로세스가 사용한 실제 CPU time 입니다. 여러 프로세서가 병렬로 동작할 수 있기 때문에 때때로 real time보다 user + sys time이 더 클 수도 있습니다. 즉 프로세스 안에 여러 thread가 존재하고 이 프로세스가 둘 이상의 연산 프로세서에서 처리된다면 real time보다 더 큰 값으로 측정될 수 있습니다. 

 

 

* A brief primer on Kernel vs. User mode 

On Unix, or any protected-memory operating system, 'Kernel' or 'Supervisor' mode refers to a privileged mode that the CPU can operate in. Certain privileged actions that could affect security or stability can only be done when the CPU is operating in this mode; these actions are not available to application code. An example of such an action might be manipulation of the MMU to gain access to the address space of another process. Normally, user-mode code cannot do this (with good reason), although it can request shared memory from the kernel, which could be read or written by more than one process. In this case, the shared memory is explicitly requested from the kernel through a secure mechanism and both processes have to explicitly attach to it in order to use it.

The privileged mode is usually referred to as 'kernel' mode because the kernel is executed by the CPU running in this mode. In order to switch to kernel mode you have to issue a specific instruction (often called a trap) that switches the CPU to running in kernel mode and runs code from a specific location held in a jump table. For security reasons, you cannot switch to kernel mode and execute arbitrary code - the traps are managed through a table of addresses that cannot be written to unless the CPU is running in supervisor mode. You trap with an explicit trap number and the address is looked up in the jump table; the kernel has a finite number of controlled entry points.

The 'system' calls in the C library (particularly those described in Section 2 of the man pages) have a user-mode component, which is what you actually call from your C program. Behind the scenes, they may issue one or more system calls to the kernel to do specific services such as I/O, but they still also have code running in user-mode. It is also quite possible to directly issue a trap to kernel mode from any user space code if desired, although you may need to write a snippet of assembly language to set up the registers correctly for the call.

 

 

* More about 'sys'

There are things that your code cannot do from user mode - things like allocating memory or accessing hardware (HDD, network, etc.). These are under the supervision of the kernel, and it alone can do them. Some operations like malloc orfread/fwrite will invoke these kernel functions and that then will count as 'sys' time. Unfortunately it's not as simple as "every call to malloc will be counted in 'sys' time". The call to malloc will do some processing of its own (still counted in 'user' time) and then somewhere along the way it may call the function in kernel (counted in 'sys' time). After returning from the kernel call, there will be some more time in 'user' and then malloc will return to your code. As for when the switch happens, and how much of it is spent in kernel mode... you cannot say. It depends on the implementation of the library. Also, other seemingly innocent functions might also use malloc and the like in the background, which will again have some time in 'sys' then.


Reference : https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1

LIST