CPU 타임
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
CPU 시간은 CPU가 작업을 수행하는 데 소요된 시간을 의미하며, 사용자 시간, 시스템 시간, 유휴 시간, 스틸 시간으로 구분된다. 사용자 시간은 사용자 공간에서 실행되는 코드의 시간, 시스템 시간은 커널 공간에서 실행되는 코드의 시간, 유휴 시간은 CPU가 유휴 상태인 시간, 스틸 시간은 가상화 환경에서 하이퍼바이저에 의해 CPU 사용이 제한된 시간을 나타낸다. 유닉스 계열 운영 체제에서는 `top`과 `time` 명령어를 사용하여 CPU 사용 시간 및 관련 정보를 확인할 수 있다. 다중 코어 환경에서는 각 코어의 CPU 시간을 합산한 총 CPU 시간을 활용하며, CPU 시간과 실제 경과 시간 사이의 관계를 이해하는 것이 중요하다. 또한, 프로그램 내에서 CPU 시간을 측정하기 위해 `clock()` 및 `getrusage()`와 같은 함수를 사용할 수 있다.
더 읽어볼만한 페이지
CPU 타임 | |
---|---|
개요 | |
정의 | 컴퓨터가 프로그램을 실행하는 데 소비하는 실제 시간 |
측정 단위 | 일반적으로 초 단위로 측정 |
구성 요소 | 사용자 시간 시스템 시간 |
세부 정보 | |
사용자 시간 | 프로그램의 명령어를 실행하는 데 소요된 시간 |
시스템 시간 | 커널이 시스템 호출을 실행하는 데 소요된 시간 |
CPU 사용률 | CPU 시간은 CPU 사용률을 측정하는 데 사용될 수 있음 |
정확도 | CPU 시간은 타이머 인터럽트의 빈도에 따라 달라짐 |
컨텍스트 스위치 | 다중 프로세스 환경에서는 CPU 시간이 프로세스 간 전환에 의해 영향을 받을 수 있음 |
I/O 대기 시간 | I/O 작업 대기 시간은 CPU 시간에 포함되지 않음 |
실시간 | 실시간은 프로그램이 시작된 시점부터 종료될 때까지 걸린 총 시간 (벽시계 시간) |
다중 코어/프로세서 | 다중 코어/프로세서 시스템에서는 CPU 시간이 단일 코어에서 실행되는 경우와 다를 수 있음 |
활용 | |
성능 분석 | 프로그램 성능 분석 및 병목 현상 식별에 활용 |
스케줄링 | 운영 체제의 프로세스 스케줄링 알고리즘에서 사용 |
자원 관리 | 시스템 자원 관리 및 할당에 사용 |
고려 사항 | |
오버헤드 | 운영 체제 및 하드웨어 오버헤드는 CPU 시간에 영향을 미칠 수 있음 |
최적화 | 효율적인 알고리즘 및 코딩 기술을 사용하여 CPU 시간 최적화 가능 |
2. CPU 시간의 구분
CPU 시간은 CPU가 어떤 작업을 수행했는지에 따라 사용자 시간, 시스템 시간, 유휴 시간, 스틸 시간 등으로 세분화될 수 있다.
- 사용자 시간(user time): CPU가 사용자 공간에서 코드를 실행한 시간이다.
- 시스템 시간(system time): CPU가 커널 공간에서 코드를 실행한 시간이다.
- 유휴 시간(idle time, 전체 시스템에만 적용): CPU가 작업을 하지 않은 시간으로, 시스템 유휴 프로세스가 실행된 시간을 의미한다.
- 스틸 타임(steal time, 전체 시스템에만 적용): 가상화 환경에서 운영 체제가 실행하려 했으나 하이퍼바이저에 의해 실행이 허용되지 않은 시간이다.[5]
유닉스 계열 운영 체제에서는 사용자 시간과 시스템 시간을 CPU 시간의 구성 요소로 본다. 대부분의 프로그램은 실행 중 시스템 호출을 통해 운영 체제에 입출력 작업 등을 요청하며, 이러한 요청 처리 시간은 시스템 시간에 포함된다.[5]
벽시계 시간(경과된 실제 시간)은 프로그램 시작부터 종료까지 걸린 시간으로, 사용자 시간, 시스템 시간 외에 프로세스가 실행되지 않은 시간도 포함된다.
2. 1. 사용자 시간 (User Time)
CPU가 사용자 공간에서 코드를 실행하는 데 소요된 시간이다. 사용자 시간은 응용 프로그램의 로직 실행 등, 사용자가 직접 실행하는 프로그램 코드가 CPU를 사용한 시간을 의미한다.[5] 유닉스 계열 운영 체제에서 사용자 시간은 CPU 시간의 두 가지 구성 요소 중 하나이며, 대부분의 프로그램이 실행 중에 운영 체제에 요청을 한다는 사실을 반영한다.[5] 파일을 읽거나 화면에 쓰는 것과 같은 입출력 작업은 시스템 호출을 통해 운영 체제에 요청함으로써 수행된다.[5]2. 2. 시스템 시간 (System Time)
CPU가 커널 공간에서 코드를 실행하는 데 소요된 시간이다. 이는 사용자 프로그램이 시스템 호출을 통해 운영 체제의 커널 기능을 사용하는 시간으로, 입출력 처리, 메모리 관리 등 커널이 프로세스를 대신하여 수행한 작업 시간을 의미한다.[5] 예를 들어, 스레드가 시스템 호출을 발행한 후 등 실행 중인 컨텍스트를 대신하여 커널이 작업을 수행했던 시간을 나타낸다.2. 3. 유휴 시간 (Idle Time)
CPU가 바쁘지 않은 시간, 또는 CPU가 시스템 유휴 프로세스를 실행한 시간이다. 유휴 시간은 실제로 사용되지 않은 CPU 용량을 측정한다.[5]2. 4. 스틸 시간 (Steal Time)
가상화 하드웨어에서 운영 체제가 실행을 원했지만, 하이퍼바이저에 의해 실행이 허용되지 않은 시간이다.[4] 이는 물리적 하드웨어가 여러 게스트 운영 체제를 실행하고 하이퍼바이저가 CPU 타임 슬롯을 다른 타임 슬롯에 할당하기로 선택한 경우 발생할 수 있다.3. 유닉스 명령어
유닉스 계열 운영체제는 CPU 시간을 측정하고 분석하기 위한 다양한 명령어를 제공한다. 유닉스 시스템에서 "회계" 프로세스는 CPU 시간을 사용자 시간과 시스템 시간으로 구분한다. 사용자 시간은 CPU가 사용자 공간에서 코드를 실행하는 데 걸리는 시간이고, 시스템 시간은 CPU가 커널 공간에서 코드를 실행하는 데 걸리는 시간이다. 입출력 작업과 같이 운영체제가 프로세스를 대신하여 수행하는 작업은 시스템 시간에 포함된다.
경과된 실제 시간(실제 시간, 벽시계 시간)은 프로그램 시작부터 종료까지 걸린 시간을 의미하며, 사용자 시간, 시스템 시간, 그리고 프로세스가 실행되지 않은 시간을 모두 포함한다.
`top`과 `time` 명령어는 각각 모든 프로세스와 특정 프로세스에 대한 CPU 시간 정보를 제공한다. (하위 섹션 참조)
3. 1. top 명령어
유닉스 명령어 top은 모든 프로세스의 CPU 시간, 우선순위, 경과된 실제 시간 및 기타 정보를 실시간으로 업데이트하여 제공한다.[1]
3. 2. time 명령어
유닉스 명령어 `time`은 특정 명령어 또는 파이프라인 실행에 대한 CPU 시간(사용자 시간 + 시스템 시간)과 경과된 실제 시간을 출력한다. 이를 통해 프로그램의 성능을 측정하고 최적화할 수 있다. 많은 명령줄 셸에는 이 명령어에 대한 자체 구현이 있으므로, 유닉스 프로그램 `time`을 실행하려면 전체 경로인 `/usr/bin/time`을 사용해야 한다.다음은 명령어 실행 예시이다.
```text
$ gcc nextPrimeNumber.c -o nextPrimeNumber -lm
$ /usr/bin/time ./nextPrimeNumber 300000070034
300000070034보다 큰 소수는 300000070043입니다.
0.01user 0.00system 0:00.01elapsed 100%CPU
```
위 예시에서 프로세스는 총 0.02초의 CPU 시간(사용자 시간 + 시스템 시간)을 사용했다. 보고된 시스템 시간은 0.00초인데, 이는 사용된 시스템 시간의 양이 출력 해상도인 0.01초 미만임을 의미한다. 경과된 실제 시간은 0.08초였다.
다음은 위 예제에서 사용된 `nextPrimeNumber` 애플리케이션의 소스 코드이다.
```c
// nextPrimeNumber.c
#include
#include
#include
int isPrimeNumber(unsigned long int n) {
unsigned long int limit = ceil(sqrt(n));
for (int i = 2; i <= limit ; ++i)
if (n % i == 0) return 0;
return 1;
}
int main(int argc, char *argv[]) {
unsigned long int argument = strtoul(argv[1], NULL, 10), n = argument;
while (!isPrimeNumber(++n));
printf("Prime number greater than %lu is %lu\n", argument, n);
return 0;
}
```[1]
4. 총 CPU 시간
멀티 프로세서 및 멀티 코어 프로세서 시스템에서 프로그램은 병렬 처리 방식으로 두 개 이상의 프로세서를 동시에 사용할 수 있다. 이러한 상황에서는 프로그램에서 사용된 모든 프로세서에서 소비된 CPU 시간을 합산한 ''총 CPU 시간'' 측정이 유용하다.
병렬 처리를 사용하는 프로그램의 경우, 해당 프로그램의 총 CPU 시간은 일반적으로 경과된 실제 시간보다 크다. 오버헤드 없이 작업을 두 프로세서에 균등하게 분할할 수 있는 프로그램의 경우, (총 CPU 시간)/(프로세서 수) 값은 경과된 실제 시간과 거의 동일하다. 여기서 ''프로세서''는 (싱글 코어) CPU 또는 멀티 코어 CPU의 코어 하나일 수 있다.
예를 들어 4 코어 프로세서에서 실행되는 소프트웨어 애플리케이션은 4개의 유닉스 프로세스를 생성한다. 각 프로세스가 개별 프로세서 코어에서 실행될 수 있다면, 계산은 4개의 프로세서 코어에서 동시에 진행된다. 이상적으로, 총 CPU 시간은 경과된 실제 시간의 4배가 된다.
실제로, 병렬 처리는 사용되는 프로세서 수에 따라 단위 시간당 계산량이 증가하는 선형적인 속도 향상을 거의 달성하지 못한다. 일부 뻔뻔할 정도로 병렬적인 문제는 이러한 솔루션을 허용하지만, 대부분의 경우 프로그램이 시작될 때 계산을 분할하고, 마지막에 각 프로세서의 결과를 결합하기 위해 추가 작업이 필요하다. 이 추가 작업은 총 CPU 시간에 더해진다. 종종, 프로세스는 다른 프로세스로부터 데이터를 기다려야 계속 진행할 수 있으며, 이는 또한 총 시간에 추가된다.
5. CPU 시간과 경과된 실제 시간
경과된 실제 시간(또는 실제 시간, 벽시계 시간)은 일반 시계로 측정한 컴퓨터 프로그램의 시작부터 종료까지 소요된 시간이다. 경과된 실제 시간은 사용자 시간, 시스템 시간, 그리고 프로세스가 어떤 이유로든 실행되지 않은 시간을 포함한다.
단일 CPU를 사용하는 컴퓨터 프로그램의 경우, 경과된 실제 시간은 CPU 시간보다 항상 크거나 같다. I/O와 같은 대기 현상이 없고 프로그램 실행이 선점되지 않으면 경과된 실제 시간과 CPU 시간은 사실상 동일하다.
멀티 프로세서 및 멀티 코어 프로세서 시스템에서 프로그램은 병렬 처리 방식으로 두 개 이상의 프로세서를 동시에 사용할 수 있다. 이러한 상황에서는 프로그램에서 사용된 모든 프로세서에서 소비된 CPU 시간을 합산한 ''총 CPU 시간'' 측정이 유용하다.
병렬 처리를 사용하는 프로그램의 경우 해당 프로그램의 총 CPU 시간은 일반적으로 경과된 실제 시간보다 크다. 오버헤드 없이 작업을 두 프로세서에 균등하게 분할할 수 있는 프로그램의 경우, (총 CPU 시간)/(프로세서 수) 값은 경과된 실제 시간과 거의 동일하다. 여기서 ''프로세서''는 (싱글 코어) CPU 또는 멀티 코어 CPU의 코어 하나일 수 있다.
예를 들어 4 코어 프로세서에서 실행되는 소프트웨어 애플리케이션이 4개의 유닉스 프로세스를 생성하고 각 프로세스가 개별 프로세서 코어에서 실행될 수 있다면, 계산은 4개의 프로세서 코어에서 동시에 진행된다. 이상적으로, 총 CPU 시간은 경과된 실제 시간의 4배가 된다.
그러나 실제로는 병렬 처리는 사용되는 프로세서 수에 따라 단위 시간당 계산량이 증가하는 선형적인 속도 향상을 거의 달성하지 못한다. 대부분의 경우 프로그램이 시작될 때 계산을 분할하고, 마지막에 각 프로세서의 결과를 결합하기 위해 추가 작업이 필요하며, 이는 총 CPU 시간에 더해진다. 또한, 프로세스가 다른 프로세스로부터 데이터를 기다려야 계속 진행할 수 있는 경우에도 총 시간에 추가된다.
6. CPU 시간 측정 함수
최신 CPU는 타임 스탬프 카운터, 고정밀 이벤트 타이머, 실시간 시계 등 여러 개의 클록과 카운터를 가지고 있으며, 각 클록과 카운터는 특수한 용도로 사용된다. 프로그램이 자체 작동 시간을 측정하려는 경우, POSIX의 '''`clock()`''' 함수나 '''`getrusage()`''' 함수 등을 사용할 수 있다.
`clock()` 함수는 프로그램이 사용한 CPU 시간을 반환한다. POSIX는 이 시계가 임의의 값에서 시작하도록 허용하므로, 경과된 시간을 측정하려면 '''`clock()`'''을 두 번 호출하여 그 차이를 계산해야 한다.[1]
`getrusage()` 함수는 POSIX 환경에서 프로세스가 소비한 CPU 시간뿐만 아니라 근사 메모리 사용량, 컨텍스트 스위치 횟수 등 더 많은 정보를 반환하며, 그 기능은 운영 체제에 따라 다를 수 있다.[1]
6. 1. clock() 함수
POSIX의 '''`clock()`''' 함수를 사용하면 프로그램이 사용한 CPU 시간을 측정할 수 있다. POSIX는 이 시계가 임의의 값에서 시작하도록 허용하므로, 경과된 시간을 측정하려면 프로그램은 '''`clock()`'''을 호출하고, 작업을 수행한 다음, 다시 '''`clock()`'''을 호출해야 한다.[1] 두 호출 간의 차이가 작업을 수행하는 데 필요한 시간이다.6. 2. getrusage() 함수
POSIX 함수 '''getrusage()
'''는 POSIX 환경에서 프로세스가 소비한 CPU 시간뿐만 아니라 더 많은 정보를 반환한다. 이 함수는 근사 메모리 사용량 및 컨텍스트 스위치 (스케줄링) 이벤트 수를 포함하여 프로세스의 많은 측정을 반환한다. 기능은 운영 체제에 따라 다르다.[1]참조
[1]
웹사이트
https://www.gnu.org/[...]
[2]
웹사이트
wall clock timeの意味・使い方|英辞郎 on the WEB
https://eow.alc.co.j[...]
[3]
웹사이트
wall timeの意味・使い方|英辞郎 on the WEB
https://eow.alc.co.j[...]
[4]
웹사이트
CPU time accounting
http://www.ibm.com/d[...]
IBM
2014-08-05
[5]
웹인용
CPU time accounting
http://www.ibm.com/d[...]
IBM
2014-08-05
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com