-
[CS] 운영체제 - CPU 스케줄링CS📟 2022. 11. 3. 00:55
CPU 스케줄링
CPU and I/O burst ( 하나의 프로세스의 일생 )
- CPU bound job
- CPU를 길게 쓰는 프로그램
- 예) 계산을 오래 하는 작업
- I/O bound job
- CPU를 비교적 짧게 사용
- 예) 주로 사람과 인터렉션하는 프로그램
- 여러 종류의 job이 섞여 있기때문에 CPU 스케줄링이 필요하다
- I/O bound job을 먼저 CPU를 주면 짧게 쓰고 I/O 장치를 사용하러 가지만 CPU bound job을 먼저 주면 I/O 장치까지 놀게 될 수 있다.
CPU Scheduler & Dispatcher
- CPU Scheduler
- 여러 작업이 존재하기에 스케줄링이 필요
- Ready 상태의 프로세스 중 CPU를 줄 프로세스를 고른다.
- Dispatcher
- CPU의 제어권을 CPU Scheduler에 의해 선택된 프로세스에게 넘김
- 이 과정을 context switch라고 한다.
- CPU 스케줄링이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우
- nonpreemptive(자진 반납)
- Running -> Blocked (ex: I/O System call)
- Terminate
- preemptive(강제로 반납)
- Running -> Ready(ex: time out timer interrupt)
- Blocked -> Ready(ex: interrupt after I/O Complete)
스케줄링 성능 척도( Scheduling Criteria)
- CPU utilization(이용료)
- 높을수록 좋음
- Throughput(처리량)
- 많을수록 좋음
- Turnaroind time( 소요시간, 반환 시간)
- 사용시간과 대기시간 전부
- 빠를수록 좋음
- Waiting time(대기시간)
- CPU를 사용하려고 와서 기다린 시간의 합
- 큐에서 줄 선 모든 시간
- 빠를수록 좋음
- Response time(응답 시간)
- 최초로 CPU를 얻기까지 시간(CPU를 사용하려고 하는 순간부터 최초로 CPU를 얻기까지)
- 빠를 수록 좋음
CPU 스케줄링 알고리즘
- FCFS(First Come First Served)
- nonpreemptive
- 선착순으로 처리
- 사용시간이 긴 프로세스에게 먼저 CPU를 주면 비효율적
- Convoy effect
- 1차 세계대전 때 잘 싸우는 사람이 앞에서 오래 싸워주면 뒤에 사람들이 오래 살아남는 효과에서 유래
- SJF(Shortest Job First)
- 각 프로세스의 다음번 CPU burst time을 가지고 스케줄링에 활용
- CPU burst time이 가장 짧은 프로세스에게 먼저 CPU를 줌
- nonpreemptive
- 일단 CPU를 잡으면 CPU burst가 완료될 때까지 CPU를 선점당하지 않는다.
- preemptive
- 현재 수행 중인 프로세스의 CPU burst time보가 짧은 프로세스가 오면 CPU를 빼앗김(남은 시간 기준)
- SRTF(Shortest Remaining Time First)
- 가장 적은 평균 대기 시간을 보장 가능
- 기아 현상이 발생
- CPU burst time가 긴 프로세스가 CPU를 얻지 못하는 상황 발생
- 다음 프로세스의 CPU burst를 미리 알 수 없음
- 과거를 보고 예측해서 판단
- 1에 가까울수록 직전 값을 사용
- Priority 스케줄링
- 우선순위로 CPU를 줌
- SJF도 일종의 Priority 스케줄링이다.
- nonpreemptive, preemptive로 구현 가능
- Aging
- 오래 기다릴 경우 우선순위를 높여준다
- RR(Round Robin)
- Timer에 시간을 세팅해서 시간이 지나면 인터럽트를 걸어서 CPU를 뺏음
- 보통 10 ~ 100m/s
- 기아 현상 예방 가능
- 할당 시간이 너무 길거나 짧으면 문제가 됨
- 평균 turnaround 시간이 길어짐
- 짧은 job과 긴 job이 섞여있어야 효율적
- 똑같은 job이 계속 올 경우 다 같이 기다리다가 다 같이 종료될 수 있음
- Multilevel Queue
- Ready queue를 여러 개로 분할
- foreground에 인터렉티브 한 Job
- background에 인터렉티브 하지 않은 Job
- 각 큐는 독립적인 스케줄링 알고리즘을 가짐
- foreground - RR
- 응답이 빨라야 함
- background - FCFS
- 시간이 긴 Job들은 차례로 처리하는 게 나음
- foreground - RR
- 큐에 대한 스케줄링이 필요
- Fixed priority 스케줄링
- 모든 foreground 큐가 해결되면 background 큐를 처리
- Time slice
- 각 큐에 CPU time을 적절한 비율로 할당
- foreground 80%, background 20%
- Fixed priority 스케줄링
- Ready queue를 여러 개로 분할
- Multilevel Feedback Queue
- 큐 간에 이동이 가능
- 각 큐에 스케줄링 알고리즘 존재
- 상위 큐로 보내는 기준
- 하위 큐로 보내는 기준
- Multiple Processor 스케줄링
- CPU가 여러 개인 경우 더 복잡
- Homogeneous(균질한) processor
- Queue에 한 줄로 세워서 각 프로세서가 알아서 꺼내가게 할 수 있다.
- 반드시 특정 프로세서에서 수행되어야 하는 프로세스가 있는 경우는 복잡
- Load sharing
- 일부 프로세서에 job이 몰리지 않도록 부하를 적절히 공유하는 메커니즘 필요
- 별개의 큐를 두는 방법, 공동 큐를 사용
- Symmetric Multiprocessing(SMP)
- 모든 CPU가 대등
- 각 프로세서가 각자 알아서 스케줄링
- Asymmetric multiprocessing
- 하나의 프로세서가 시스템에 데이터의 접근과 공유를 책임
- Real Time 스케줄링
- 데드라인이 있는 경우에 사용
- Hard real time systems
- 정해진 시간 안에 반드시 끝내야 함
- 오프라인으로 스케줄링하는 경우도 있음
- 오프라인은 미리 프로세스들의 도착시간을 알고 하는 것
- Soft real time systems
- 일반 프로세스보다 우선순위가 높아야 함 (예: 영상)
- 데드라인을 반드시 지켜야 하는 것은 아님
- Hard real time systems
- 데드라인이 있는 경우에 사용
- Thread 스케줄링
- Local 스케줄링
- User level thread(운영체제가 모름)
- 사용자 수준의 thread library에 의해 스케줄링
- Global 스케줄링
- Kenel level(운영체제가 알도 있음)
- 일반 프로세스처럼 커널의 단기 스케줄러가 결정
- Local 스케줄링
- Algorithm Evaluation
- Queueing models
- 확률 분포로 job의 도착률과 처리율이 주어짐
- 수식을 통해 처리량, 대기 시간이 반환
- Queueing models
- implementation(구현) & Measurement(성능 측정)
- 실제 시스템에 알고리즘을 구현
- 실제 작업에 대해서 성능 측정(실제로 구현한 후 테스트해본다)
- 리눅스 내부 코드를 수정해야 해서 난도가 높다
- Simulation(시뮬레이션)
- 모의 프로그램으로 작성하고 테스트
- input data(trace)가 신빙성이 있어야 함
- trace
- 실제 프로그램에서 추출
- 제작
'CS📟' 카테고리의 다른 글
[CS] 운영체제 - 병행제어 II (0) 2022.12.26 CS 스터디 - 운영체제 : 병행제어 I (0) 2022.11.04 [CS 스터디] OS - Process (0) 2022.10.22 CS 스터디 - 컴퓨터 시스템의 구조 (0) 2022.10.14 [CS 스터디] 운영체제 개요 (1) 2022.10.07 - CPU bound job