여러줄로 cpu를 기다리는 줄서기를 배워보자
완전히 계급제
위에 queue에 process가 없어야 밑에 quque에 있는 process가 cpu를 얻을 수 있음.
=> 어떤 queue에 넣을 것인가, starvation은 어떻게 해결할 것인가에 대한 질문
foreground quque : 사람과 interactive 하는 process이기 때문에 응답시간을 짧게 해야 함. => Round Robin 스케줄링
background queue : cpu를 오랫동안 사용하는 process이기 때문에 응답시간이 빠를 필요 없음. 되려 cpu를 뺏었다가 얻었다가 하는 context switch로 인해 생기는 오버헤드를 줄이기 위해서 먼저 온 순서대로 처리=> FCFS 스케줄링
=> 어떤 queue에 cpu를 줄 것이냐? 하는 문제
1) Fixed priority scheduling
foreground에 있는 프로세스가 cpu를 다 쓰고 나서야 backgroud 에 cpu를 준다.
starvation이 생길 수 있는 문제
2) Time slice
cpu 시간을 적정한 비율로 나눈다.
Multilevel quque는 Round Robin 과 달리 공정하지 않음.
대신, 우선적인 process한테 cpu를 차별적으로 주면서 효율성이 증대 된다.
신분을 영원히 극복하지 못함
지금까지는 cpu가 1개일 때를 이야기 했다.
이제는 "cpu가 2개"이거나 "시간의 데드라인 조건"이 있거나 "스레드가 여러개" 있거나 등 특이한 케이스에서 스케줄링을 이야기해보자
1) cpu가 여러개 있을 때
real-time job: deadline이 있는 job
soft-real time: 최근에는 일반적인 time sharing system에서 다른 process들하고 섞여서 실행되는게 있다. ex) 영화보는 것.
반드시 deadline을 지키는 시스템은 아님.
thread: 하나 process 안에 cpu 수행단위가 여러개 있는 것.
thread 구현 방식
1) user level thread: 사용자 process가 thread를 직접 관리하고 운영체제는 thread의 존재를 모르는 경우
2) kernel level thread: 운영체제가 이 thread의 존재를 이미 아는 것.
상황이 다르기 때문에 thread를 스케줄링 하는 방법도 다름.
Local Scheduling: 운영체제는 어떤 프로세스한테 cpu를 줄지 결정하고, 해당 프로세스 내부에서 어떤 스레드에게 cpu를 줄지 스케줄링한다.
Global Scheduling: process 스케줄링 하듯이, 운영체제가 어떤 알고리즘에 근거해서 이번에 어떤 스레드에게 cpu를 줄지 스케줄링한다.
어떤 알고리즘이 좋은지 평가하는 방법에 대해 알아보자.
1. Queueing models
2. **Implementation(구현) & Measurement(성능 측정) **
ex) cpu 스케줄링 알고리즘을 하나 만들었음. 그 알고리즘이 좋은지 실제 시스템에 구현. linux 커널의 소스코드를 수정해서 새로운 알고리즘으로 바꿔. 리눅스 커널을 컴파일하면, 리눅스의 실행 binary code가 나온다. 그래서 실제 프로그램들을 돌려서 어느쪽이 얼마나 빨리 끝나는지 확인하는 방식.
3. Simulation
그런데 2번과 같이 직접 리눅스 커널 운영체제 내부의 코드를 고치는 것은 어려운 일임/ 그래서 simulation이 있음.