Shine's dev log
프로세스 스케줄링_1 본문
1. 프로세스 스케줄링이란?
하나의 컴퓨터에서는 여러개의 프로세스가 각자의 address space를 가지고 실행될 수 있다.
만약 processor의 수가 process의 수보다 적다면, 프로세스를 parallel하게 운영하는 것은 불가능할 것이고, concurrent하게 운영해야 할 것이다. 즉, 여러개의 프로세스를 조금씩 돌려가며 실행시켜야 한다는 것이다.
여기서, 다음 프로세스는 뭘 돌릴지, 어디부터 돌릴지, 언제 바꿀지를 결정하는 녀석이 바로 Schedular 이다. 참고로 이 스케줄러는 운영체제에 포함되어 있다.
Schedular는 processor에게 각 프로세스의 address space를 매핑해준다. 이를 illusion을 제공해준다고 표현하는데, 왜냐면 각 프로세스가 각자 processor를 가진 것처럼 해주기 때문이다.
2. Process schedular
프로세스 스케줄러의 목표는 CPU의 효율성을 극대화시키기 위해 빠르게 프로세스들을 context switch 해주는 것이다.
스케줄러는 "ready"상태의 프로세스중에서만 선택을 한다. (process state 참고)
이때, 한가지 의문점이 들 수 있다. '만약 CPU하나에 여러 프로세스를 돌려쓰면 성능이 n분에 1이 되는것이 아닐까..?'
결론부터 말하자면 아니다. 그 이유는 아래의 그림을 보면 잘 이해될 것이다.
프로세스가 CPU를 사용하는 때를 CPU burst, 그냥 입출력을 마냥 기다리고 있을때를 waiting for I/O라 하는데, 대부분의 프로세스들은 이 CPU burst time 이 굉장히 짧다. 아래의 그림을 보면 한번에 알 수 있을 것이다.
이렇게 대부분의 프로세스가 실제 CPU를 쓰는 시간은 짧기때문에 하나의 CPU에 여러 프로세스를 돌려써도 크게 성능저하가 일어나지 않는다.
3. Context switch
하나의 processor에 돌던 프로세스를 다른 프로세스로 바꾸는 과정을 context switch라고 한다.
이렇게 context switch가 일어날 때 시스템은 현재 돌던 프로세스의 상태를 저장하고, 다음 불러올 프로세스의 상태를 불러와야한다. 이런 프로세스들의 상태를 context라고 하는데, 각 프로세스들의 context들은 PCB에 저장되어있다.
위의 그림은 context switch가 일어날때의 과정을 그린 그림이다. 보다시피 과정이 꽤나 복잡한데, 이런 context switch하는것 자체가 overhead이다.
1) 운영체제나 PCB가 복잡하다면 그 overhead가 더 커질 것이고, 2) 하드웨어도 context switch time에 굉장히 큰 영향을 미친다.
4. Process scheduling
스케줄러는 process state가 바뀌는 모든 경우에 다 관여해야 하므로 효과적으로 관리를해야한다. 아래의 그림은 스케줄링이 일어나는 과정을 나타낸 그림이다.
먼저 ready queue에는 ready상태인 프로세스들이 들어있다.(linked list로 구현되어있다.)
이제 스케줄러는 ready queue에있는 프로세스 중 하나를 빼서 CPU에 dispatch해준다.
CPU에서 실행중이던 프로세스가 특정 event 때문에 빠져야 한다면 스케줄러는 I/O request, time slice expired, for a child, wait for and interrupt 이 네가지 상황에 따라 처리해준다.
오늘 내용을 정리해보면,
1. 프로세스 스케줄러는 하나의 여러 프로세스들이 실행될 때 concurrency를 만들어준다.
2. 프로세스들이 바뀔때를 context switch라 하는데, 이때 각 프로세스의 상태를 PCB에 로드, 세이브 해준다.
3. 프로세스들은 CPU에 dispatch되기 전에 ready queue에 들어있다.
본 내용은 공부하며 작성한 것으로, 치명적인 오류가 있을 수 있습니다.
'운영체제' 카테고리의 다른 글
프로세스 스케줄링_3 (FCFS, SJF, SRTF) (0) | 2020.05.07 |
---|---|
프로세스 스케줄링_2 (starvation, preemptive) (0) | 2020.05.05 |
쓰레드(Thread)_3 (Issues in Threading) (0) | 2020.04.28 |
쓰레드(Thread)_2 (multi threading models) (0) | 2020.04.27 |
Concurrency와 Parallelism (0) | 2020.04.26 |