CPU구조부터 OS구조까지 파야되는지라 일단 미룸..
사실 저거 공부한지가 4년이 넘어서 기억이 가물가물해서 다시 공부해야됨 ㅠㅠ
그래서 토막글로 윈도우에 있는 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)는 유저모드 프로세스(그냥 통상 볼 수 있는 프로그램)는 권한이 없어서 실행 할 수 없다!
오늘도안녕하신가
잉텔
오늘도안녕하신가
잉텔
오늘도안녕하신가
잉텔
OS 공룡책 원서로 봐서 수업시간에 ㅈ같았다..
루니오스
잉텔
루니오스
잉텔
매우진한고룡종피
잉텔
담요
잉텔
잠적자
여기쓰면 묻혀요 아조씨!
잉텔
샤랄랄랄라
잉텔
폐폐
간단히 말하면 놀고있는 비율을 나타내는거잖아? 사용율 총합이 100%가 되야하니까?
잉텔
심바