티스토리 뷰

프로그래밍

컴퓨터의 작업

과정 2017. 4. 23. 01:07

윈도우에 있는 System Idle Process에 대해서 알아보자


윈도우에서 작업 관지라에서 프로세스를 뒤지다 보면 CPU 사용률이 유독 높은 프로세스를 볼 수 있다.


작업관리자를 켜보자


뭐? 98퍼나 CPU를 쓰고 있다고?


근데 시스템 모니터에서는 10퍼도 안쓰고 있다...


작업관리자에서도 저 프로세스의 속성을 보려고 해도 볼 수가 없다.


우리가 알 수 있는건 PID와 실행한 사용자만 알 수 있다..


아무리 시스템 프로세스라해도 왜 저렇게 CPU 사용률이 높은걸까?


저 프로세스 이름을 다시한번 확인해보자 System Idle Process


시스템  Idle(유휴)상태 프로세스다.


그러니깐 CPU가 실행할 작업이 없으면 계속 실행되는 프로세스라는거다!


그런데 왜 CPU가 유휴상태에서 저 프로세스를 계속 가동시키는가? 그냥 냅두면 안될까?


모든 CPU들은 기본적으로 계속 프로그램을 실행하고 있는 상태다.


그러니깐 CPU는 프로그램을 한줄 실행했다가 쉰다는 그런 개념은 없다.


명령을 실행했으면 다음 명령도 실행해야되고 또 다음 명령을 수행하고 또 또 다른 명령을 수행하고 이렇게 반복되어진다..


만약 다음에 실행할 명령이 없다면? OS 개발 서적 보면서 해본 내 경험상 한 몇초있다가 그대로 컴퓨터가 꺼지더라..


결국 계속 어떤 프로그램이던 CPU가 프로그램을 계속 실행할 수 있도록 해야한다.

(물론 CPU를 유휴상태로 보낼수 있는 명령어가 있지만 그건 후에 설명하자)


이때 CPU를 계속 프로그램을 실행 시킬 수 있는 방법중 제일 쉬운 방법은 아무것도 실행 하지 않고 계속 루프를 도는거다.


마치


while (!system_halt)

{

// Do Nothing

}


이걸 어셈블리로 나타내면


:idle

jmp idle


이렇게 말이다.. 뭐 문제가 없어보이는데.. 뭐 당장에도 문제는 없어 보인다.


하.지.만. 저 아무것도 안하는 프로그램도 보면 idle 번지로 점프해서 수행하라는 명령이 무한정 수행된다.


결국 jmp idle 이라는 명령이 CPU 내부 사이클을 모두 점유하고 있따는 이야기가 된다.


이는 CPU가 계속 켜져있어야 한다는 말이되고, EIST(스피드스텝) 가 있다면 CPU를 유휴 상태 클럭으로 내릴 수 없다..


고로 CPU는 저 아무것도 안하는 프로그램을 수행하면서 전기를 먹을 수 있는 최대 상태로 다 까 잡숴 드신다.


이는 CPU가 아무것도 하지 않아도 엄청난 열기를 뿜어낸다는 말과 같다..


위와 같은 방법은 Busy Waiting 이라고 부른다. 근데 저 방식 자체도 나쁜건 아니다.


CPU를 항상 켜놓을 수 있으니 다른 작업이 을 수행 할때 바로 할 수 있는 장점이 있다.


또한 마이컴 정도면 저 방식을 써도 상관이 없다.

(어차피 마이컴정도면 20MHz 내외 인데... 뭐 발열도 없다시피 하다..)


자 그러면 Busy Waiting 말고 다른방법은 무엇일까?


대부분 CPU들은 자기를 유휴 상태로 보낼 수 있는 명령이 있다.


바로 halt 명령이다. x86에서는 해당 명령을 hlt라고 쓴다

(리눅스의 halt 명령과는 좀 다르다... 유의하자!)


CPU가 halt 명령을 만나면 진짜 아무것도 안한다.


그럼 nop 명령하고 뭐가다르냐!!


nop도 아무것도 안하긴 하지만 nop는 CPU 사이클을 점유한다.


하지만 halt 명령은 아무것도 안하기도 하고 CPU 사이클을 점유하지도 않는다.


그렇다면 CPU를 유휴 상태로 두려면 halt를 무한정 수행하면 된다!


while (!system_halt)

{

// Halt

hlt();

}


위 코드를 어셈블리로 표현하면


:idle

hlt

jmp idle


그런데 왜 무한정 halt를 수행할까?


halt로 만든 CPU 유휴 상태는 CPU의 외부 인터럽트가 있으면 바로 풀린다.


여기서 인터럽트는 다른 작업을 전환하기 위한 태스크 스위칭일수도 있고, 장치가 보내는 인터럽트일 수 있다.


태스크 스위칭의경우


A  -> 유휴 -> B -> 유휴


가 될 수 있고 프로세스 A, B 둘다 CPU를 엄청 쓰고 있다면


A -> B -> B -> A -> A -> 유휴 -> A -> A -> B


가 될 수 있겠다..


장치가 보내는 인터럽트라면


A -> 마우스 인터럽트 처리 -> 유휴 -> A


이렇게 될 수 도 있겠지..


그때는 CPU가 깨어나는데, 깨어나고 나서 다시 할일이 없으면 어쩌겠나..


다시 halt 명령으로 재워야한다...


결국 System Idle Process는 OS 내부에서 CPU를 유휴상태로 만들기 위해  halt 명령을 계속 실행 시키는 역할을 하고, 논리적으로 보면 CPU를 계속 사용하는것 처럼 보이기 때문에 항상 높은 점유율을 가지고 있다!


ps. 참고로 x86에서 halt 명령어(hlt)는 유저모드 프로세스(그냥 통상 볼 수 있는 프로그램)는 권한이 없어서 실행 할 수 없다!



-이해하지 못한 사람을 위한 추가 설명-


NOP명령은 No Operation의 약자로 CPU가 아무일도 안할 수 있도록 만들어주는 명령인데, HLT 명령 역시 CPU가 아무일도 안할 수 있도록 해주는 명령임. 근데 NOP는 CPU 파이프라인을 점유하지, 하지만 HLT는 CPU 파이프라인을 점유하지 않아 쉽게 표현하면 일꾼이 있으면 일꾼한테 NOP 명령을내리면 책상에 앉아서 아무것도 안하는 상태, HLT 명령을 내리면 일꾼은 책상을 비우고 침대에 누워있는 상태라고 볼 수 있지..


인터럽트는 CPU가 어떤일을 하고 있는데, 어떤요인(HW가 CPU한테 알림, SW가 임의적으로 트랩)에 의해서 CPU가 현재 하던일을 중단하고 처리하도록 하도록 하는것


마이컴은 보통 MCU라고 말하는데, 소위 말하는 컨트롤러 수준(자판기, 세탁기, 시계)에 들어가는 정도 CPU를 의미함


태스크스위칭은 작업전환을 의미해 컴퓨터의 멀티태스킹은 여러가지일은 돌아가면서 매우 빠르게 처리한다고 했지? 이때 현재 하던일을 잠깐 멈추고 다른일로 바꾸는걸 태스크스위칭이라고 부름


여기서 A와 B는 프로세스를 의미함. 왜 번갈아 가면서 하는지는 태스크스위칭 참조


"HLT 명령어를 실행한다는건 분명 CPU를 사용하고 있는건데 논리적으로 보면 CPU를 계속 사용한다는것처럼 보인다" 이말은 OS 관점에서 봐야되는데 A, B, SysIdle 프로세스가 OS상에 올라가고 있어, SysIdle은 HLT 를 무한정 실행하는 프로세스 이고, A, B는 그냥 일반 프로세스인거지 A, B가 놀고 있을때는 SysIdle 프로세스가 HLT 명령을 무한정 호출하지? 그럼 SysIdle 프로세스 혼자서 CPU를 점유하고 있다는 말이되. 그럼 OS 입장에서는 SysIdle은 CPU를 100퍼센트의 유틸라이제이션을 가지고, A 프로세스/B 프로세스는 지금 0퍼센의 CPU 유틸라이제이션을 가지고 있구나라고 생각하는거지. 물론 CPU 입장에서는 HLT 명령이 무한정 들어오니깐 쉬는거나 마찬가지인거고..

댓글