5. 프로세스를 스케줄링하기 위한 큐
큐는 각 프로세스의 PCB를 연결리스트 형태로 관리하며 포인터를 사용해 순서를 정한다.
- 준비 큐(ready queue)
현재 메모리 내에 있으면서 cpu를 잡아서 실행되기를 기다리는 프로세스의 집합, waiting 상태이므로 메모리에 올라가있음
- 장치 큐(device queue)
I/O device의 처리를 기다리는 프로세스의 집합, blocked 상태
- 작업 큐(job queue)
현재 시스템 내에 있는 모든 프로세스의 집합, 작업 큐에 속한다고 메모리를 가진 것은 아님
운영체제는 준비 상태에 있는 프로세스들을 줄세우고 cpu를 나눠주기 위해서 준비 큐를 둔다. 그리고 큐의 선입선출 특성을 이용하여 제일 앞에 서 있는 프로세스에게 cpu를 할당한다. 이때 준비 큐에 프로세스를 줄 세우는 방법은 cpu 스케줄링에 따라 달라진다.
그리고 장치 큐(device queue)라는 것도 있다. 예를 들어 디스크 i/o를 요청한 프로세스는 disk i/o queue에 줄 서게 되고 그럼 디스크 컨트롤러는 순서대로 제일 앞에 있는 프로세스의 요청을 들어준다. 작업이 완료되면 디스크 컨트롤러는 인터럽트를 발생시키고 인터럽트 처리 루틴에 의해서 입출력이 완료된 프로세스는 다시 준비 큐에 가서 cpu를 얻길 기다린다. 앞서 말한 cpu나 i/o는 전부 하드웨어 자원을 얻기 위한 줄세우기다. 그렇다면 소프트웨어 자원을 얻기 위한 줄세우기는 어떨까?
공유 데이터에 대한 접근 권한은 소프트웨어 자원으로 분류할 수 있다. 어떠한 프로세스가 공유 데이터를 사용하는 중에 다른 프로세스가 같은 데이터를 접근하면 데이터에 대한 일관성이 깨질 수 있다. 예를 들어 내가 공유 데이터에 있는 x 변수에 +1을 하고 있는데 다른 프로세스가 와서 -2하면 안된다는 얘기다. 따라서 공유 데이터는 매 시점 하나의 프로세스만 접근하여야 하는데 이때 접근한다는 것이 반드시 cpu가 그 데이터를 사용한다는 것을 의미하는 것이 아니다. 공유 데이터에 접근하고 있는 프로세스가 running이 아닌 waiting, blocked으로 변경된 경우에도 cpu를 할당받은 프로세스가 동일한 데이터에 접근하게 되면 데이터의 일관성이 해쳐질 수 있으므로 접근을 허락해서는 안된다. 즉 공유 데이터라는 일종의 소프트웨어 자원은 cpu 수행이 끝난 프로세스더라도 걔가 반납할 때까지 남에게 허락을 사용해서는 안된다. 따라서 이러한 소프트웨어 자원을 사용하길 원하는 프로세스들은 자원 큐(resource queue)에 줄서서 기다려야 한다.
이와 같이 프로세스의 상태 관리는 커널의 주소 영역 중 데이터 영역에 다양한 큐를 두어 수행하게 된다. 따라서 각 프로세스가 cpu를 기다리는지, 입출력을 기다리는지 등의 정보를 커널이 총체적으로 관리한다는 뜻이다. 예를 들어 타이머 인터럽트가 걸리면 커널은 자신의 데이터 영역에 있는 준비큐를 참조해 어떤 프로세스에게 cpu를 할당해줄지 결정하고 현재 프로세스는 준비 큐 제일 뒤로 보낸다.
장치 큐는 각각의 자원마다 큐가 하나씩 존재하며, 여기서 큐헤더(queue header)는 큐의 가장 앞부분을 말한다. 큐는 각 프로세스의 pcb를 연결리스트 형태로 관리하며 포인터를 사용해 순서를 정한다. 프로세스가 cpu를 할당받고 코드를 수행하다가 입출력 요청이 발생하면 해당 장치 큐로, 타이머 인터럽트가 발생하면 준비 큐 제일 뒤로 가서 다시 줄을 선다. 장치 큐에 속한 프로세스들은 봉쇄 상태에 있다가 해당 장치의 서비스를 받고 나서 장치 컨트롤러가 인터럽트를 발생시키면 준비 상태로 바뀌어 준비 큐로 이동한다.
6. 스케줄러
스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 거널의 코드를 지칭한다.
스케줄러에는 장기스케줄러, 단기 스케줄러, 중기 스케줄러가 있다. 하나씩 천천히 살펴보자
* 장기 스케줄러(long term scheduler or job scheduler)
- 시작 프로세스 중 어떤 것을 ready queue로 보낼지 결정한다. 그러니까 프로세스 상태도에서 new->ready로 바뀌는 것을 결정하며 그 얘기는 메모리(및 각종 자원)를 주는 것을 결정한다는 것이다. 프로그램이 시작될 때 메모리를 줄지 말지 결정한다. 그러나 time sharing 시분할 시스템에서는 사용하지 않는다. time sharing에서는 무조건 readu이기 때문에. degree of multiprogramming(메모리에 올라가있는 프로세스 수)를 제어한다. 얘는 수십초 내지 수 분 단위로 가끔 호출하기 때문에 상대적으로 속도가 느려도 괜찮다.
* 단기 스케줄러(short term scheduler or cpu scheduler)
- 준비 큐에 있는 어떤 프로세스를 다음 번에 running 시킬지 결정하는 것이다. 프로세스에 cpu를 주는 문제이고 (ready -> running) 충분히 빨라야 한다(millisecond 단위로 빈번하게 호출됨)
* 중기 스케줄러(medium term or swapper)
- 일단 메모리에 올려놓고 시작한다. 그런데 프로세스가 너무 많으면 쫓아낸다. 멋진 말로 하면 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러라는 말이다. 너무 많은 프로세스가 메모리에 올라가있을 경우 프로세스 당 보유하고 있는 메모리의 양이 극도로 적어저 cpu 수행에 당장 필요한 프로세스의 주소 공간조차도 메모리에 올려놓기 어려운 상황이 발생한다. 이렇게 되면 디스크 swap area에 들렸다 넣었다 뺐다 아무튼 시스템의 성능이 저하된다. 따라서 중기 스케줄러는 메모리에 올라와있는 프로세스 중 일부를 선정해 이들로부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장해둔다. 이와 같은 행위를 스왑 아웃(swap out)이라고 한다. 중기 스케줄러는 프로세스당 보유 메모리 양이 지나치게 적어진 경우 이를 완화시키기 위해 일부 프로세스를 메모리에서 디스크로 스왑 아웃 시키는 역할을 한다.
그렇다면 중기 스케줄러는 어떤 프로세스를 swap out해야 할까? 0순위의 프로세스는 단연 blocked 상태의 프로세스들이다. 어차피 얘네는 당장 cpu를 획득할 가능성이 없기 때문에(왜냐하면 blocked 상태 풀려도 ready queue 가서 줄 서야 함) 메모리를 가지고 있을 의미가 없다. 그렇게 blocked인 애들을 전부 쫓아냈는데에도 메모리가 부족하다면 timer interrupt가 발생하여 ready queue로 이동하는 프로세스를 추가로 swap out 시킨다. 준비 큐에 너무 많은 프로세스들이 존재하면 개별 프로세스에 배정되는 메모리의 양이 지나치게 적어질 뿐 아니라 cpu를 한번 할당 받은 뒤 다시 할당 받기까지 오래 걸리기 때문에 이런 얘들로부터 메모리를 회수하고 당장 cpu 제어권을 얻은 실행하게 될 프로세스에게 메모리를 추가해주는 것이 효율적이다. 중기 스케줄러는 장기스케줄러와 마찬가지로 이렇게 메모리에 올라오는 프로세스의 수를 조절하는 역할을 수행한다.
중기 스케줄러의 등장으로 인한 프로세스의 상태에는 변화가 생기는데
- running
- ready
- blocked(wait, sleep)
- suspend(stopped)
suspend(stopped)는 프로세스 관점에서 외부적인 이유(중기 스케줄러가 범인이다)로 프로세스의 수행이 정지된 상태를 말한다. 프로세스는 통째로 디스크에 swap out된다. blocked는 자기가 요청한 event가 만족되면 ready큐로 이동하지만 얘는 외부(역시나 중기스케줄러?)에서 resume 해 주어야 active해질수 있다. 사용자가 프로그램을 일시 정지 시킨 경우(break key), 시스템(중기 스케줄러)가 메모리에 너무 많은 프로세스가 있다고 할 때 프로세스를 중단시킨 상태이다.
blocked 상태에서 중기 스케줄러에 의해 swap out되면(0순위) suspended block이 되고 ready 상태에 있던 프로세스가 중기 스케줄러에 의해 swap out되면(1순위) 이 프로세스의 상태는 suspended ready가 된다. suspended blocked이던 프로세스가 봉쇄되었던 조건을 만족하면 이 프로세스의 상태는 suspended ready가 된다.
suspended는 메모리를 잃어버리는 것이지만 i/o 정도는 할 수 있음
'CS > operating system' 카테고리의 다른 글
CPU Scheduling: CPU 스케줄링 (1/2) (0) | 2021.02.12 |
---|---|
Process Management: 프로세스 관리 (3/3) (0) | 2021.02.10 |
Process Management: 프로세스 관리 (1/3) (0) | 2021.02.09 |
Program Execution: 프로그램의 실행(메모리 로드) 2/2 (0) | 2021.02.08 |
Program Execution: 프로그램의 실행(메모리 로드) (1/2) (0) | 2021.02.04 |