컴퓨터시스템 안에 있는 프로세스에는 I/O 바운드잡도 있고 CPU 바운드잡도 섞여 있기 때문에 CPU Scheduling이 필요하다.
FCFS의 경우는 cpu오래 사용하는 프로세스가 먼저 cpu를 잡게 되면, 뒤에 오는 프로세스들이 오래 기다려야 하기 때문에 효율적이지 않다.
Round Robin은 할당된 시간만을 주어서 cpu를 쓰고, 다시 뺏어 와서 다른 프로세스에게 넘겨주는 것이다.
cpu를 짧게 사용하는 I/O바운드 잡인 경우라면 자신이 원하는 cpu만 쓰고 나갈 수 있고, cpu바운드 잡의 경우는 사용하고 빼앗기는 것을 반복한다.
오랫동안 독점하는 프로세스가 있으면, 뒤에 있는 프로세스가 피해를 보기 때문에 할당시간을 주어서 효율적으로 cpu를 쓰게 한다.
프로세스의 컨텍스트를 save하고 다시 그 지점 부터 재개할 수 있는 메커니즘이 제공되기 때문에 가능하다. 만약 그렇지 않다면 다시 맨처음부터 해야 하기 때문에 라운드로빈을 사용하는 의미가 사라질 것이다.
지금까지 살펴본 cpu스케줄링의 경우 Q를 이용해서 ready상태에 있는 프로세스가 하나씩 차례대로 들어왔다. 이번에 살펴볼 Multilevel queue는 여러줄로 Q가 있어서 ready상태의 프로세스가 여러줄로 기다리는 상태이다.
위의 그림에서는 두개로 나누었다. foreground/ background
각각의 줄마다 스케줄링이 필요하다. 줄에 특성에 맞는 q별 스캐쥴링이 필요하다.
먼저, 어느 대기줄에 cpu를 줄것인가를 결정한다. 그 후에는 줄 내에서 어떤 프로세스에게 cpu를 줄것인가를 결정한다.
우선순위가 높은 것만 주게 되면 기아 현상이 발생할 수 있다.
time slice를 통해 비율로 cpu를 할당 할 수도 있다.
줄마다 우선순위가 있고, 각 우선순위에 맞는 곳에 줄을 선다.
cpu는 우선순위가 높은 것 부터 처리를 한다.
프로세스를 어느 줄에 넣을 것인가를 생각해야 한다.
우선순위가 낮은 프로세스는 영원히 cpu를 얻지 못할 수 있다.
여러줄도 줄서기를 하면서도 프로세스가 줄간의 이동이 가능한 스캐쥴링 방식이다.
처음에 우선순위가 낮아도 우선순위가 높아질 수 있다.
처음 들어오는 프로세스는 우선순위가 높은 곳에 넣고, 밑에 갈 수록 라운드로빈의 할당시간을 많이 주고, FCFS를 마지막에 한다.
cpu가 여러개 있거나, 시간에 대한 데드라인이 있거나, 스레드가 여러개 있는 경우등의 특이 경우에 대한 스케쥴링
cpu가 여러개 있는 경우의 스캐쥴링이다. cpu가 여러 개 있으면 load sharing이 잘 되어야 한다. 특정 cpu만 일하는 것이 아닌 적절히 균형있게 돌아가야 한다.
Deadline이 있는 잡이다.
정해진 시간안에 반드시 실행되어야 하는 것이다.
real time job은 데드라인을 보장해주어야 한다.
프로세스 하나 안에 cpu수행단위가 여러개 있는 것이 스레드이다.
Local scheduling(os가 하는 것이 아니라 사용자프로세스가 한다)
스레드를 구현 하는 방식이 userlevel
사용자 프로세스가 직접 스레드를 관리하고 운영체제는 스레드의 존재를 모른다.
운영체제는 스레드의 존재를 모르기 때문에 그냥 cpu를 줄지 말지를 결정하고, cpu를 잡았을때 프로세스 내부에서 어떤 스레드에게 cpu를 줄지를 프로세스가 결정한다.
global scheduling
karnel level thread는 운영체제가 스레드의 존재를 알고 있는 상황이다.
프로세스 스캐쥴링을 하는 것처럼 어떤 스레드에게 cpu를 줄지를 결정한다.