뇌를 자극하는 윈도우즈 시스템 프로그래밍 9장
프로세스의 스케줄링
일반 OS와 리얼타임 (Real Time) OS의 차이점
이 내용을 스케줄링에서 언급하는 이유?
일반 OS와 리얼타일 OS를 결정짓는 요소가 스케줄러이기 때문이다.
스케줄러가 어떻게 스케줄링 하냐에 따라서 일반 OS가 되기도 하고 리얼타일 OS가 되기도 한다.
리얼타임 OS
- 리얼타임 즉 실시간이라는거다. 실시간이라는 거는 바로바로 응답한다는 소리다. 응답성이 좋다
- 바로바로 응답을 한다는 것은 얼마나 많은 프로그램이 동작을 하고 있더라도 바로바로 실행을 시켜야 한다는 의미다.
일반 OS와 리얼타임 OS가 프로세스를 실행 시켰는데 둘 중에서 리얼타임 OS가 시작이 빠르다.
하지만 중요한거는 시작이 빠르다고 해서 계속 빠른 거는 아니다.
일반 OS가 시작이 느려도 먼저 도착을 할 수 있는거고 리얼타임 OS가 먼저 도착할 수 있다.
최종적인 속도는 CPU에 의존적인거고 일반 OS냐 리얼타임 OS냐는 시작 타임을 가지고 결정을 짓는다.
동일한 CPU를 가지고 있는데 일반 OS는 느리고 리얼타임 OS는 왜 빠르냐? 빠르다는 건 결국 CPU가 빠르다는 거 아니냐?
위 문제의 답을 선점형 OS냐 비선점형 OS냐 관점에서 얘기를 할려한다. 그전에 타임 슬라이스에 대해 알아보자
타임 슬라이스
일반 OS 관점에서의 타임 슬라이스
한 프로세스가 CPU를 할당 받아 한 번에 수행될 수 있는 시간이다.
스케줄링 과정에서 작업 시간이 긴 프로세스가 CPU를 오랫동안 독점하지 못하도록 방지한다.
타임 퀀텀(Time Quantum)이라고도 한다.
- 일반 OS는 둘 이상의 프로세스를 실행시킨다.
- 각 프로세스의 우선순위가 동일하면 번갈아 가면서 실행을 시켜야 한다.
- 번갈아 가면서 실행을 시킬려면 기준이 있어야 한다.
- 예를 들어 각 프로세스 실행 시간이 3초라고 해보자
- 컴퓨터에는 시계가 없어서 내부적으로 클럭을 발생시킨다. 이 클럭을 가지고 타임 슬라이스를 정한다.
- 클럭과 클럭 사이의 시간을 1초라고 해보자. 1초 간격으로 클럭이 발생된다.
- 타임 슬라이스가 3초라면 세 개의 클럭이 하나의 타임 슬라이스가 된다.
- 즉 타임 슬라이스는 초가 아니라 몇 클럭이 타임 슬라이스인지 클럭 관점에서 봐야 한다.
- 즉 시스템 관점에서는 타임 슬라이스는 초가 아니라 몇 클럭이냐다.
- 타임 슬라이스가 3초라는 뜻은 3초에 한 번씩 프로세스의 실행주기가 바뀐다는 의미다.
- 프로세스가 실행의 주기를 갔다가 이동할 때 타임 슬라이스를 기준으로 프로세스 실행을 이동시킨다.
일반 OS와 리얼타임 OS의 가장 큰 차이점
- 일반 OS는 타임 슬라이스가 길다. 그래서 응답시간이 느리다.
- 리얼타임 OS는 타임 슬라이스가 작다. 그래서 응답시간이 빠르다.
예를 들어서 A 프로세스가 실행되다가 멈추고 B 프로세스가 실행된다고 해보자
A가 중단되면 B가 바로 실행되는 게 아니라 A 프로세스에 할당된 3초 동안은 B 프로세스가 실행이 안된다.
즉 응답성이 3초는 걸린다는 소리다.
반면 리얼타임 OS는 타임 슬라이스가 작다.
그래서 A 프로세스가 시작을 하자마자 B 프로세스에게 바로 양보해서 B 프로세스가 실행이 될 수 있다.
초반 시작이 빠른 이유는 타임 슬라이스가 작아서 그런 거지 CPU 성능 하고는 전혀 상관이 없다.
선점형 OS와 비선점형 OS
누가 먼저 선점하냐에 따라서 OS가 결정된다.
우선순위: 누구를 먼저 실행시킬지 결정짓는 요소
선점형 OS
A 프로세스의 우선순위는 2 B 프로세스는 3이라고 가정하자.(3이 2보다 높음) 그럼 B가 더 높으므로 B가 A보다 먼저 실행이 된다. 만약 A가 실행이 되고 있는데 B가 생성이 되면 스케줄러는 A 프로세스를 바로 밀어내고 B 프로세스를 실행시킨다.
비선점형 OS
B 프로세스의 우선순위가 높아도 실행 중인 A 프로세스를 바로 밀어내지 않는다.
A 프로세스가 양보하겠다는 명시적인 선언을 해야 우선순위가 높은 프로세스가 실행될 수 있다.
비선점형은 실행 중인 프로세스가 CPU를 포기해야 그 다음 프로세스가 실행이 될 수 있어 프로그래머가 실행의 우선순위를 근거로 해서 프로세스의 실행을 결정해줘야 한다.
스케줄러 관점에서 선점형 OS 비선점형 OS를 구분할 수 있냐가 중요하다.
스케줄러가 더 많이 프로세스 실행에 직접적으로 관여하는 게 선점형 OS다.
비선점형 OS는 선점형 OS에 비해 스케줄러가 하는 일이 제한적이다.
스케줄링 알고리즘
평등과 특권의 공존
평등
- 동일 우선순위
- 동일 우선순위인 경우 평등을 주장
- 라운드로빈 기반
- 평등 원칙을 주장하기 위해서 사용하는 알고리즘을 가리켜 라운드로빈 알고리즘이라 한다.
특권
- 높은 우선순위
- 우선순위가 높은 프로세스에게 특권을 허용한다.
- 우선순위 기반
- 우선순위 기반의 특권을 존중하기 위한 알고리즘을 가리켜 우선순위 알고리즘이라 한다.
우선순위 스케줄링 알고리즘
우선순위 스케줄링 알고리즘이란 각각의 프로세스마다 우선순위를 부여해서 우선순위가 높은 프로세스를 먼저 실행시키는 방식이다. 우선순위가 7인 프로세스와 우선순위가 2인 프로세스를 동시에 실행시키면 어떻게 될까?
흔히 생각하는 것이 시간의 분배이다. 우선순위 7인 프로세스가 10초 정도 실행되면, 우선순위 2인 프로세스는 적어도 2초 정도는 실행될 걸로 생각한다. 정답은 보통, 알고리즘이란 것이 다양하게 디자인 가능하지만 보편적인 운영체제에서 우선순위가 2인 프로세스는 결코 실행되지 않는다. 이러한 상황을 가리켜 기아 상태라 하는데, 우선순위가 2인 프로세스는 기아 상태에 빠지게 된다.
라운드 로빈(Round-Robin) 스케줄링 알고리즘
우선순위가 높은 프로세스가 먼저 실행된다고 하였는데, 그렇다면 우선순위가 동일한 프로세스의 경우에는 누가 먼저 실행될까? 여기서 형평성 문제가 발생하게 되는데, 그래서 Windows는 라운드 로빈 스케줄링 알고리즘을 적용하고 있다. 이 알고리즘은 같은 우선순위의 프로세스들 간 형평성 유지를 위해, 정해진 시간 간격만큼만 실행을 하고 우선순위가 동일한 다른 프로세스에게 CPU의 할당을 넘기는 방식을 제공한다. 오로지 형평성 유지를 위해서다.
실행의 최소 단위 시간 간격을 가리켜 퀀텀 혹은 타임 슬라이스라 하는데, 동일한 우선순위의 모든 프로세스들은 이 타임 슬라이스를 기준으로 CPU의 할당을 넘기게 된다. 타임 슬라이스를 어느 정도로 두느냐에 따라서 운영체제의 성격이 달라지기도 하는데, 타임 슬라이스를 길게 하면 인터렉티브 한 시스템에서 문제가 될 수 있다. 즉 여러분이 마우스로 드래그 앤 드롭을 하는데 반응이 늦게 나타나는 것이다. 그렇다고 해서 타임 슬라이스를 너무 짧게 잡으면 컨텍스트 스위칭이 자주 발생해서 성능에 저하를 가져다준다.
Windows 운영체제의 스케줄링 알고리즘
Windows 운영체제는 프로세스를 스케줄링하는 데 있어서 우선순위, 그리고 라운드 로빈 기반의 알고리즘을 적용하고 있다.
windows는 우선순위 기반과 라운드 로빈 기반 알고리즘을 적절히 혼용하여 선점형 운영체제 특성을 나타내도록 디자인되었다.
- 위와 같이 메모리 블럭을 구성한다.
- priority queue는 링크드 리스트로 연결된다.
- priority가 2인 큐에 2개의 프로세스가 매달려 있다.
- priority가 5인 큐에 4개의 프로세스가 연결되어 있다.
- priority가 7인 큐에 4개의 프로세스가 연결되어 있다.
일단 높은 우선순위를 생각해서 프로세스 중에 가장 높은 우선순위를 가진 프로세스를 본다.
그럼 priority가 7인 큐에 4개의 프로세스 간에는 라운드로빈 방식을 기반해서 실행한다.
I/O에 관련된 작업을 할 때는 프로세스가 CPU를 차지하지 않는다. 그래서 프로세스가 blocked 모드로 빠진다.
그때 우선순위가 낮은 프로세스가 실행될 수 있다.
스케줄링 알고리즘에 의해서 스케줄링이 진행되는 시점
- 라운드 로빈 방식
- 정해진 시간이 지나면 다음 프로세스에게 실행순서를 넘겨야 한다. 그런데 실행순서를 넘기기 위해서는 스케줄러가 동작해야 한다. 즉, 프로세스의 실행 시간 간격에 해당하는 매 타임 슬라이스마다 동작해야 한다.
- 우선순위 방식의 스케줄링 알고리즘
- 우선순위가 높은 프로세스는 무조건 먼저 실행돼야 한다. 따라서 새로운 프로세스가 등장할 때마다 스케줄러는 현재 실행 중인 프로세스와 새로운 프로세스를 비교해야 한다. 즉 새로운 프로세스가 생성될 때마다 스케줄러는 동작해야 한다. 조금 더 나아가서 반대로 현재 실행 중인 프로세스가 종료된다면 다른 프로세스를 실행시켜야 하므로 이 경우에도 스케줄러가 동작해야 한다.
- 블로킹 상황
- 현재 실행 중인 프로세스가 블로킹 상황이 되면 다른 프로세스가 대신 실행된다. 따라서 현재 실행 중인 프로세스가 블로킹 상태에 놓이면 다음 실행될 프로세스 선정을 위해서도 스케줄러가 동작하게 된다.
위 언급한 내용을 종합해서 스케줄러가 동작하는 상황을 아래와 같이 정리할 수 있는데, 이는 선점형 운영체제의 특성과도 흐름을 같이한다.
- 매 타임 슬라이스마다 스케줄러 동작
- 타임 슬라이스 사이에서도 컨텍스트 스위칭은 발생할 수 있는가?
- YES 관점
- 타임 슬라이스를 좁게 잡으면 좋지만 컨텍스트 스위칭이 자주 발생해서 성능에 문제가 있을 수 있다.
- 그래서 성능에 무리가 가지 않는 선까지 타임 슬라이스를 넓게 잡는다.
- 근데 넓게 잡아버리면 넓게 잡은 사이에 프로세스가 작업을 마무리 할 수 있기에 낭비가 될 수 있다.
- 그래서 타임 슬라이스 사이에도 스케줄러가 동작되게끔 한다는 소리다.
- NO 관점
- 타임 슬라이스를 좁게 잡아서 처리를 한다.
- YES 관점처럼 타임 슬라이스 사이에도 컨텍스트 스위칭이 발생하면 더 많은 컨텍스트 스위칭이 발생해서 성능 저하가 심해진다.
- 스케줄러도 하나의 프로세스다. 즉 스케줄러가 동작하면 다른 프로세스가 실행할 수 없다.
- 그래서 스케줄러가 자주 발생하면 성능이 저하된다.
- OS 사용자가 불편함을 못 느끼는 한도 내에서 가급적이면 스케줄러를 적게 깨우기 위한 철학이 들어가 있다.
- 최소한으로 스케줄러가 동작하게끔 설계했다.
- 타임 슬라이스 사이에서도 컨텍스트 스위칭은 발생할 수 있는가?
- 프로세스가 생성 및 소멸될 때마다 스케줄러 동작
- 프로세스가 생성되면 현재 실행 중인 프로세스와 새로운 프로세스를 비교하므로 동작한다.
- 프로세스가 소멸되면 다른 프로세스를 실행시켜야 하므로 스케줄러가 동작한다.
- 현재 실행 중인 프로세스가 blocked 상태에 놓일 때마다 스케줄러 동작
- 여기서 blocked 상태에 놓인다는 거는 I/O 연산 때문에 blocked 상태에 놓이는 거를 의미한다.
- I/O 연산에 의해서 프로세스 자체가 blocked 모드가 된다.
- blocked 상태로 바꾸거나 새로운 프로세스가 running 상태가 되게끔 하는 게 스케줄러의 역할이다.
Priority Inversion
말 그대로 프로세스의 우선순위가 뒤 바뀌는 현상을 말한다.