2020. 10. 28. 15:44ㆍ운영체제/프로세스
프로세스 스케줄링
내 나이 28살, 오래 살았다고 생각하진 않지만 인생사에서 무엇인가를 선택하는 것은 굉장히 중요하다고 말할 수 있다. 우리는 살면서 항상 선택의 기로에 놓인다. 왜냐하면 수 많은 선택지도 있지만, 중요하다고 생각하는 선택지가 한 개만 있는 것은 아니기 때문이다. 굉장히 일상적인 예시를 들자면, 중국집에서 메뉴를 고를 때도 우리는 흔히 짜장면과 짬뽕 중 무엇을 선택할 건지에 대해 항상 고민한다.
본론으로 돌아와보자. 중요한 선택을 해야하는 것은 운영체제도 마찬가지인 것 같다. 프로세스의 정의를 기억하는가? 프로세스는 작업이 커널에 등록된 상태를 얘기한다. 예를들어 CPU 한 개에 프로세스가 두 개가 있는 경우, 각 프로세스는 CPU 1개에 존재하는 자원을 번갈아가면서 사용해야한다. 즉, 이 상황에서 운영체제는 자원을 할당할 프로세스를 선택해야하는데, 이러한 작업을 프로세스 스케줄링이라고 한다.
프로세스 스케줄링의 목적
프로세스 스케줄링의 목적은 시스템 성능을 향상시키는 것이다. 그러면 시스템 성능은 무엇에 의해 결정되는걸까? 바로 응답시간, 작업처리량, 자원활용도 등과 같은 지표들에 의해 결정된다. 응답시간은 무엇인가를 요청하고, 응답이 올 때까지의 시간을 말한다. 따라서 대화형, 실시간 시스템이 응답시간 향상을 목적으로 하는 스케줄링을 하는 것이 적합하다. 또한, 작업처리량과 자원활용도는 정해진 시간내에 얼마동안 작업을 처리하고 자원을 활용했냐를 의미한다. 따라서 처리량을 관점으로한 스케줄링은 일괄처리 시스템이 적합하다. 즉 모든 지표를 충족할 수는 없기에, 스케줄링은 목적에 맞게 고려하여 사용해야 한다.
프로세스 기준 및 단계
운영체제가 다음에 어떤 프로세스에게 CPU를 할당해 줄지 고려하는 기준에는 프로세스 특성, 시스템 특성, 프로세스의 긴급성, 우선순위, 총 실행시간 등이 있다. 여기서 프로세스의 특성에 대해서 좀 더 자세히 말해보려고 한다. 프로세스는 발생 빈도 및 할당 자원에 따라서 작업을 구분해야 한다. 왜냐하면 여러 프로세스 중, CPU작업을 필요로 하는 작업(Compute-bounded)만을 준비 큐(Ready Queue)에 올려놓으면 CPU는 열심히 일을하지만, CPU를 제외한 다른 처리장치(ex. 입출력 장치)는 놀기 때문이다.
따라서, 운영체제는 CPU 작업시간(CPU Burst Time), 입 출력 작업시간(I/O Burst Time)을 적절히 고려해서 작업을 구분해줘야한다(프로세스 스케줄링). 그 중 Burst Time은 스케줄링의 중요한 특성 중 하나다.
프로세스 스케줄링은 얼마나 발생하냐는 빈도 및 할당자원에 따라 Long-term 스케줄링, Mid-term 스케줄링, Short-Term 스케줄링으로 구분할 수 있다. Long-term 스케줄링은 빈도 수가 가장 적은 스케줄링으로 작업 스케줄링(Job Scheduling)이 여기에 해당된다. 작업 스케줄링은 시스템에 제출할 작업 중 어느 것을 시스템에 등록할 지 결정하는 역할을 한다. 융통성 있게 프로세스를 관리하기 위해 작업 스케줄링은 프로세스에 갯 수 제한을 걸 수 있다. 시분할 시스템에서는 모든 작업을 등록시킨 후, 프로세스들이 시간영역을 나누어서 사용하기 때문에 장기 스케줄링이 상대적으로 덜 중요하다.
Mid-term 스케줄링은 메모리 할당과 관련있는 스케줄링 기법이다. Suspended 상태에서 있는 프로세스는 Swap-in(메모리 할당)을 통해 alseep, ready 상태로 변화할 수 있는데, 여기서 Mid-term 스케줄링이 발생한다. Mid-term 스케줄링은 복귀할 준비가 된 프로세스들 중에 누구한테 메모리 공간을 할당할지 결정하는 역할을 한다. 마지막으로 Short-term 스케줄링은 가장 빈번하게 일어나고, 속도가 빠른 스케줄링이다. 프로세스 상태도에서 프로세스가 준비상태에서 실행상태로 넘어가는 단계가 이에 해당된다. 만약 평균 CPU Burst Time이 100ms이고, 스케줄링 평균 시간이 10ms이라면, 프로세스가 종료될 때 까지 소요시간은 110ms가 된다. 여기서 10ms의 시간적 손실이 일어난다. 이처럼 프로세스 스케줄링은 프로세스 상태도와 연관성이 높다. 이를 그림으로 정리하면 다음과 같다.
프로세스 스케줄링 방법
무엇을 하는지간에 어떻게할 것인지의 방법론은 굉장히 중요한 요소다. 프로세스 스케줄링도 마찬가지다. 내가 본 강의에서는 선점, 비선점 스케줄링, 우선순위 스케줄링 세 가지 방법론에 대해서 이야기를 하였다.
비 선점 스케줄링(Non-preemptive)는 프로세스가 자원을 할당 받으면, 스스로 자원을 반납할 때까지 갖고 있는 방법을 말한다. 이는 다른 프로세스가 우선순위가 높더라도 자원을 뺏을 수 없다는 것을 의미한다. 따라서 이 방법은 프로세스 교체, 문맥교환 횟수가 적기 때문에 오버헤드가 적지만, 프로세서를 점유한 프로세스의 응답시간이 전체 평균 응답시간에 영향을 끼치고, 우선순위 역전이 잦다는 단점을 갖고 있다.
하지만 선점 스케줄링(Preemptive)는 언제든지 자원을 뺏을 수 있기 때문에 잦은 문맥교환이 일어나고 그만큼 오버헤드가 크다는 단점이있다. 그러나 응답성이 빠르기 때문에 시분할, 대화형 시스템에 사용하면 적합한 스케줄링이다.
마지막으로 우선순위 스케줄링은 정적인 방법과 동적인 방법이 있다. 정적 우선순위 스케줄링은 한번 정한 우선순위를 영구적으로 갖고 있는 것을 말한다. 이는 구현이 쉽고 오베헤드 걱정이 없으나, 동적 우선순위 스케줄링의 경우, 우선순위를 바꾸는 것이 자유롭기 때문에 구현이 복잡하고 오버헤드가 크다는 점이 있다.