그냥 실행 중인 프로그램으로는 설명하기 힘든 내용이 있기 때문에 메모리 측면에서 프로세스를 짚어본 것이다.
이제 프로세스의 스케줄링에 대해서 알아보자.
스케줄링
스케줄링? 말 그대로 스케줄을 만드는 것이다. 운영체제를 모르는 사람은 무슨 스케줄을 만들냐고 생각할 수 있다. 스케줄을 설명하기 위해서 여러 프로세스가 실행되는 상황을 연출해보자.
나는 맥도날드 햄버거 만드는 알바이다. (실제로 맥도날드 알바를 해본 적은 없다. 맥도날드가 중요한 것이 아니고, 햄버거를 만든다는 것이 중요하다) 나는 패티도 구워야하고, 햄버거에 재료를 넣기도 해야하고, 감자도 튀겨야 한다. 이 일은 단계별로 수행해야 한다고 생각해보라. 언뜻 생각하면 아무 문제 없을 것 같지만 이는 심각한 재앙이 발생하게 된다.
빵을 깔고, 패티를 굽는다. 구워질 때까지 할 수 있는 일이 없다고 스마트폰 게임을 하였다. 메니저에게 걸려서 욕을 먹었다. 욕을 먹다보니 패티가 구워졌다. 빵에 양상추, 피클, 치즈를 깔고, 패티를 올려서 햄버거를 완성했다. 하지만 주문은 세트로 들어왔다. 감자도 튀겨야 하고, 음료수도 담아야 한다. 감자를 튀기기 시작했고, 다 익을 때까지 할 일이 없어 게임을 했다. 또 걸려서 욕먹었다.
현실에서는 아무로 이런 식으로 일을 처리하지 않는다. 이렇게 일을 하면 당장 그만둬야 할 것이다. 현실에서 우리는 패티 구으면서, 감자 튀기고, 음료수도 담는다. 한 번에 여러 일을 처리한다. 이렇게 하는 것이 가장 효율적이기 때문이다. 하지만 분명한 것은 한 번에 여러 일을 처리한다기보다는 조금조금씩 이 일, 저 일을 관리하면서 처리한다는 것이다. 패티 다 굽고, 감자 다 익히는 방식이 아니라는 것이다. 이런 처리 방식은 CPU와 프로세스에도 그대로 적용된다.
햄버거 이야기에 너무 열을 올렸다. 비유는 적당해야 하거늘 비유 자체에 빠져버렸다.
여튼, 알바를 CPU라고 생각하고, 패티 굽기, 감자 튀기기, 음료 담기 등을 프로세스라고 생각하자.
CPU는 한 번에 하나의 프로세스만 처리할 수 있다. 패티 구으면서 감지 튀기는 짓을 하지 못한다. 그래서 CPU는 패티 굽다가 감자가 다 익으면 감자를 먼저 처리하고, 남는 시간에 음료도 담은 다음에, 그러는 동안 완성된 패티를 구워서 햄버거를 완성하였다. 다시 말해서 CPU는 가장 중요한 프로세스를 먼저 처리하고, 시간이 남을 때(패티가 다 구워질 때까지)는 다른 프로세스를 처리하고 있다는 점이다.
패티가 다 구워질 때까지 기다리는 시간을 I/O에 비교할 수 있을 것이다. 패티가 다 구워질 때까지 기다리지 말고, CPU는 짜투리 시간에서 음료를 담으면서 열심히 일을 한다.
그렇다면 가장 중요한 일은 무엇이고, 시간이 남는 경우는 어떻게 해야할까?
이것이 바로 OS가 담당하는 스케줄링에 대한 내용이다.
간단하게 살펴보는 I/O
Chrome으로 google에 접속한다고 하자. 주소창에 google.co.kr를 입력하였다. 그 다음은 google 사이트가 뜰 때까지 기다려야 한다. 기다리는 일 말고는 무얼할 수 있겠는가? CPU도 마찬가지이다. 사이트 접속하려면 google로부터 정보를 받아야 하고, 받기 위해서는 기다려야 한다. 이런 과정이 바로 I/O이다.
Input/Output의 준말이라는 사실에서 알 수 있듯이 I/O는 흔히 input과 output에서 발생한다. 사이트 접속을 위해 서버에 input을 해야하고, 서버로부터 output를 받아야 한다. 결국 input, output 사이에 CPU가 멍~하게 기다리는 기간이 발생한다.
MS WORD를 실행 중이라고 생각해보자. CPU는 사실 엄청난 처리 속도를 지니고 있지만 사용자의 키보드, 마우스 입력이 있기 전에는 멍~ 하게 기다린다. 이 또한 I/O이다. CPU의 능력에 비해서 input.output에 소모되는 시간이 길어서 CPU가 놀게되는 것이다.
인간은 CPU와 같은 기계가 노는 것을 용납하지 않는다. 늘 일을 시켜야 한다. 그래서 특정 프로세스에서 I/O가 발생하면 CPU는 다른 프로세스를 처리한다. 잠시도 못 쉬는 것이다.
프로세스 스케줄링
<출처: http://www.tutorialspoint.com/operating_system/os_processes.htm>
위 그림에서 각각의 타원은 프로세스의 상태를 나타낸다.
new: 새롭게 생성된 프로세스
ready: 실행이 준비된 상태인 프로세스
waiting: I/O 혹은 event에 의해 실행이 일시적으로 중지된 프로세스
running: 실행 중인 프로세스
terminated: 종료된 프로세스
모두 5가지의 상태를 지니고 있다. 일반적으로 프로세스는 생성되면, 즉 프로그램이 실행되면 해당 프로세스는 new 상태를 거쳐 ready 상태가 된다.
ready 상태가 되면 scheduler에 의해 선택될 수 있는 자격을 얻는 것이다. 그런데 자격을 얻는다고 해서 모두 running 상태가 되지는 않는다. 프로세스는 특정한 기준에 의해 실행될 수 있는 우선순위(priority)를 가지고 있고, 이 우선순위가 높을 수록 스케줄러에 의해 먼저 실행된다.
만약 프로세스 A가 실행되고 있는 상태라고 가정하자. 이 때 프로세스 B가 생성되었다. 우선순위를 A와 B 중에 어떤 일을 먼저 CPU가 처리하도록 할 것인지 판단한다. 만약 프로세스 B의 우선순위가 A에 비해서 낮다면 A는 계속 running 상태일 것이고, B는 ready 상태가 되어 스케줄러의 선택을 기다릴 것이다. 만약 우선순위만을 기준으로 스케줄러가 판단한다면 우선순위가 낮은 어떤 프로세스 는 계속 해서 ready 상태에 머무를 것이다. 자신의 우선순위보다 높은 프로세스 가 계속해서 생성된다면 말이다. (이런 상태를 기아(starvation))라고 부른다. 이에 대한 자세한 내용은 다루지 않겠다) 프로세스 B의 우선순위가 A보다 높다면 스케줄러를 CPU가 B를 실행하도록 하고, A는 ready 상태로 변경시킨다.
이런 일련의 과정이 바로 프로세스 스케줄링이다. 이를 처리하는 주체가 바로 스케줄러이고, 이는 소프트웨어로 구현되어 있다.
댓글 없음:
댓글 쓰기