본문 바로가기

My Study/etc

CPU 사용량, Idle 프로세스

먼저 간단하게 이야기를 풀어나갈까 합니다.
작업관리자 창을 띄워보면 많은 프로세스들이 띄워져 있는 것을 볼 수 있습니다.


이번에는 CPU사용량을 보도록 하겠습니다.

현재 메모리에 올라와있는 스레드는 625개나 됩니다. 하지만 CPU사용량은 100% 중에서 4%밖에 되질 않죠.
현재 메모리에 많은 스레드들이 올라와 있는데 왜이렇게 CPU사용량이 낮은 것일까요??
이러한 궁금증을 풀어보기로 하자는 목적으로 설명을 들어가보도록 하겠습니다.

운영체제는 스케줄러라는 일을 하고 있습니다. 스케줄러란 무엇이냐..
현재 메모리에 올라와 있는 스레드는 많이 있습니다. 하지만 스레드 하나에 CPU를 전부 할당해버리고 하나의 스레드가 일을 끝내면 다른 스레드에게 CPU를 할당해주는 형식이라면 아마 CPU에게 할당을 받아야 하는 스레드들이 매우 불평해 할것입니다.
그래서 스케줄러라는 놈은 스레드에게 할당된 퀀텀시간(정해진 시간이라고 생각하시면 됩니다.) 동안 CPU를 사용하게 하고 퀀텀시간이 끝나면 해당 스레드가 일을 다 끝마치지 못해도 다른 스레드에게 CPU할당을 해버리는 것입니다.

그러면 모든 스레드가 이러한 퀀텀 시간을 전부다 쓰느냐?? 그건 아닙니다.
만약 우리가 C언어로 프로그래밍을 할 때 반복문을 돌릴때가 있습니다. 그것도 무한으로 말이죠.

위 소스를 보시면 아시겠지만 while문으로 무한으로 돌고 있습니다.
아마 이 일을 하는 스레드에게 CPU할당을 해줬다면 퀀텀시간 동안 계속 반복문을 돌면서 출력을 할 것입니다.

다른 소스코드를 보겠습니다.

단순히 변수 값 하나를 1 증가 시키는 일을 하고 있습니다.
위 일을 CPU가 하는데 퀀텀시간 내내 할까요?? 그건 아닙니다.
스레드에게 주어진 퀀텀시간을 다 쓰질 않는 다는 것입니다.
그러면 어떻게 해야될까요?? 스레드는 자신에게 남은 퀀텀시간을 다시 반환해야 될 것입니다.

Sleep(), WaitForSingleObject()함수가 바로 퀀텀시간을 반환하는 함수입니다.
다들 아실것입니다. Sleep()함수야 뭐.. 다들 써보셨을 거고.. WaitForSingleObject()함수는 스레드를 생성하거나 스레드 동기화 하는 소스코드 만들때 써보셨을 것입니다.

반대로 대부분의 스레드가 퀀텀시간을 전부다 사용을 하게 된다면 아마 CPU 사용량이 엄청나게 높아질 것입니다.
실험을 위해서 위 반복문이 들어간 소스코드를 컴파일 시켜 실행해보도록 하겠습니다.

CPU 사용량을 봤더니 4~10%였던 CPU가 갑자기 40~50% 정도 사용하는 걸로 올라갔습니다.
모든 퀀텀 시간을 다 써버리니까 나오는 결과입니다.
( 제 컴은 듀얼코드 입니다. 그렇기 때문에 하나의 스레드만 풀로돌리니 50%정도의 결과가 나왔고.. 만약 두개의 스레드를 돌린다면 100%가 나올 것입니다. )

이제 다시 돌아와서 Sleep(), WaitForSingleObject()함수를 쓰게되면 이러한 스레드들을 스케줄러는 스케줄링에서 제외를 시켜버리게 됩니다. 뭐 일정시간이 지나면 다시 스케줄링에 포함되겠지만요..

위에서 CPU를 4%만 쓰고 있었습니다. 그러면 나머지 96%의 CPU는.. 정지된 상태로 머물게 됩니다.
하지만 인터럽트 신호를 받게된다면 정지상태가 풀어지고 다시 일을 하게되겠죠.

여기서 CPU를 정지상태로 만들려면 어떻게 해야될까요?? 바로 CPU를 정지상태로 만들어주는 프로세스 있습니다.
항상 실행되고 있죠. 바로 "Idle" 프로세스 입니다. 이 프로세스안에서 운영하는 "Idle"스레드는 더 이상 CPU를 사용할 스레드가 없는 경우에 CPU를 넘겨받는 스레드입니다. 즉, CPU가 정지되어 있는 시간동안은 Idle스레드가 CPU를 사용하게 되는 것입니다. 그냥 넘어갈 수 없으니 Idle프로세스가 얼마나 CPU를 사용하고 있는 보겠습니다.

무려 98.46%만큼 CPU를 사용하고 있습니다. 그리고 Idle프로세스는 CPU개수에 맞춰서 스레드를 운영하게 됩니다.
저 같은 경우는 CPU가 2개 이므로 2개의 스레드를 운영하고 있겠죠. 확인해 보겠습니다.

두개의 스레드를 사용하고 있다는 것을 확인해보았습니다.

그러면 Idle스레드는 어떠한 일을 하고 있을까요?
Idle스레드는 내부적으로 CPU를 정지시키는 일을 하고 있습니다. ( 정지시키는 일만 하진 않습니다. )
바로 CPU를 정지시키는 명령어가 " HIT "라는 명령어인데 스레드 내부에서 HIT명령어를 사용하고 있습니다.

이정도면 대충 설명이 된거 같습니다.

마지막 한가지만 더 보여주고 마치도록 하겠습니다. 위에서 설명했듯이 CPU의 대부분 사용은 Idle 프로세스가 차지하고 있다고 설명드렸습니다. 그렇기 때문에 아무때나 운영체제를 멈추게 해서 실행 중이었던 프로세스 정보를 봐보면 거의 백이면 백 ldle프로세스 일 것입니다. 봐보겠습니다.
이 부분은 당연한 거지만.. 한번 보여드리기 위해 해보는 것입니다.
먼저 디버기 OS에서 실행되고 있는 프로세스 목록들을 봐보겠습니다.

일부만 찍어봤는데도 아주 많은 프로세스들이 메모리에 올라와 있습니다. 이제 디버기에서 실행 중이었던 프로세스가 어떤 프로세스 였는지 보도록 하겠습니다.

역시나 예상했던 데로 Idle프로세스 였습니다.

뭐.. 우연의 일치로 다른 프로세스가 나올수도 있겠지요?~~!

'My Study > etc' 카테고리의 다른 글

곰플레이어 신기한 기능  (0) 2010.04.18
한글 깨짐 현상  (0) 2010.04.17
Acid3  (1) 2010.03.31
Vmware에 backtrack4 설치  (0) 2010.03.17
나의 USB를 꾸며보자~  (2) 2010.03.15