logo
Published on

schedule

Authors
  • avatar
    Name
    valery
    Twitter

1. CPU scheduling 목적 · 2. 스케줄링 목적 · 3. 기본개념 · 4. State Queue · 5. 알고리즘 4가지 · 6. Priority · 7. Multilevel Queue · 8. MLFQ · 9. UNIX 스케줄러 · 10. 멀티프로세서 · 11. NUMA

1. CPU scheduling의 목적

  • 실행가능한 프로세스 중 다음 프로세스를 뭘 CPU에 올릴건지 고르기
  • 자주 발생하므로 빨라야한다.

2. 스케줄링의 목적

작업을 편식하지 않고, 쉬지않고 계속 작업하되 많이 해야하고 일정을 지켜야하며 빨리 처리해야한다.

1. starvation이 없어야한다.

  1. fairness: 모든 프로세스에게 동등하게 CPU에 접근할수있어야함
  2. Balance: CPU뿐만아니라 모든 장치들이 바쁘게 돌아야함.

starvation: 실행할 준비는 되어있는데 스케줄러가 기회를 안줘서 계속 못돌고 레디하고 있는 상태

  • 안좋은 스케줄러, 동기화에서 기인한다.

2. batch system

  • 작업을 한꺼번에 넣어두고 시스템이 순서대로 처리하는 방식
  1. throughput: 1시간에 최대한 많은 작업을 해야함
  2. Turn around time: 작업을 제출한 시간부터 완전히 끝날 때까지 걸리는 시간을 줄이기
  3. CPU utilaization: cpu에게 계속 일을 시켜야함.

3. Interactive system

  • 사용자가 직접 입력하고 반응을 기다리는 시스템
  • response time: 최대한 빨리 반응해야함

4. Real-time system

  • 마감시간이 데드라인을 넘으면 안됨
  • 작업 시간이 예측 가능해야함.

3. 기본개념

1. non-preemptive vs preemptive

  1. non-preemptive: yield호출해서 자발적으로 내려놓기
    • 여기서는 우선순위가 더 높은게 나중에 들어와도 일단 이 프로세스 먼저 다 끝내고 다음 프로세스 받기
  2. preemptive: 인터럽트받아서 내려놓기
    • 문제: 공유데이터 수정 중에 인터럽트 받으면?, 시스템 콜 중에 인터럽트 받으면?
    • 동기화 문제가 따라온다(shared data, kernel state가 깨질 수 있다)
    • 여기선 우선순위가 더 높은게 들어오면 바로 context switch

2. cpu-bound vs I/O-bound

cpu bound: 긴 cpu burst(CPU사용 시간을 길게 가져간다) I/O bound: 짧은 CPU burst + 잦은 I/O wait(잠깐 CPU사용하고 I/O로 빠진다) I/O가 반응성이 더 좋다

  • 실제로 프로세스들이 CPU를 점유하는 시간은 짧다.

4. state queue 흐름

Running 상태에서
├─ time slice expired
│  └─ CPU를 너무 오래 써서 강제로 내려옴
│     → Ready Queue로 이동
├─ I/O request
│  └─ 디스크 읽기, 네트워크 요청 등
│     → I/O가 끝날 때까지 Waiting Queue로 이동
│     → I/O 완료 interrupt 발생
│     → Ready Queue로 복귀
├─ wait()
│  └─ child process 종료 같은 event를 기다림
│     → Waiting Queue로 이동
│     → child 종료
│     → Ready Queue로 복귀
└─ exit
   └─ 실행 완료
Terminated

5. scheduling 알고리즘 4가지

1. FCFS/FIFO

  • ready queue에 도착한 순서대로 실행.
  • 대체로 non-preemptive(P1실행 중에 P2가 도착해도 P1작업이 다 끝날 때 까지 기다린다)
  • 장점: 구현이 단순
  • 단점: waiting time이 길어질 수 있다(cpu burst가 긴 프로세스가 먼저 도착하면 아무리 짧은 프로세스가 나중에 도착해면 긴 프로세스를 먼저 실행하기 때문에), CPU가 중간에 길게 I/O사용하면 문제가 된다 FCFS diagram

2. SJF(Shortest Job First)

CPU burst가 가장 짧을 것으로 예상되는 프로세스를 먼저 실행

  • 목적: 평균 waiting time 줄이기
  • 조건: 모든 작업이 동시에 available(모든 프로세스가 이미 ready queue에 들어와있고 burst time도 알고 있을 때) 할 때
  • 대체로 non-preemptive로 돌아감
  • 문제점: 미래의 CPU burst time를 알 수 없다(그래서 과거 패턴보고 예측함), starvation이 발생 가능 SJF diagram

3. SRTF(Shortest Remaining Time First)

  • SJF의 Preemptive방식
  • 얘는 뭐가 다르냐, SJF에서 T1(arrival = 0, burst time = 5), T2(arrival = 2, burst time = 2)일 때
  • T1은 T2가 도착해도 T1이 다 돈 다음에 T2로 넘어가지만
  • SRTF는 T2가 도착했을 때 두개의 burst time를 비교해서(T1:3, T2:2) T2가 더 짧네? T2로 전환이 가능. 왜냐 preemptive이기 때문에. SRTF diagram

4. RR(Round Robin)

time quantum만큼씩 돌아가면서 CPU를 나눠주는 방식 ready queue를 원형 큐로 FIFO를 개량한 버전.

  • preemptive 방식 RR diagram

6. Priority Scheduling

ready queue에 있는 process 중 priority가 가장 높은 process를 선택해서 실행

  • SJF, SRTF도 이것의 일종이다(burst가 짧은게 높은 priority)
  • prority가 같다면 fifo나 RR적용도 가능하다
  • non preemptive, preemptive 둘다 가능
  • 우선순위는 다이나믹하게 바뀔 수 있다(ex: 오래기다린거 우선순위 높여주기, cpu 많이 쓴 프로세스 우선순위 낮추기)
    • 이건 MLFQ(Multilevel Feedback Queue)로 이어진다.

Priority Scheduling의 문제점

1. Starvation

  • 해결책: Aging: 오래된 프로세스 우선순위 높이기, cpu많이 먹는거 우선순위 낮추기

2. Priority inversion(우선순위 역전)

  1. 우선순위: P1 > P2 > P3
  2. P1과 P3는 같은 critical section에 들어가야함
  3. 근데 P3가 먼저 critical section에 들어가서 lock를 잡아버림
  4. 이떄 등장한 P2
  5. P2는 P3보다 우선순위가 높기에 P2부터 돌아감
  6. P3의 lock를 해제 못해서 계속 lock이 잡혀있어서 P1을 실행 못함

해결법

  1. PIP
  • 낮은 priority 작업 priority 높여주기
  • 위의 예시 같은 경우에 P3 우선순위 높여서 P3빨리 끝내게 하고 P1 다음에 돌리기
  1. PCP
  • resource마다 priority ceiling 값을 미리 정해둠
  • 어떤 thread가 그 resource를 lock하면
  • 즉시 그 ceiling priority로 올라감

7. Multilevel Queue Scheduling

프로세스를 종류별 queue에 고정 배치하고, ueue마다 다른 알고리즘을 적용하는 방식

  • 왜 분리하냐. 작업끼리 서로 원하는 목표가 다르기 때문에

foreground

  • interective 작업
    • response time 중요, 빨리 반응해야함
    • ex: terminal, editor, gui, 사용자 입력처리
    • 알고리즘 RR 사용

background

  • batch 작업
    • throughput, turnaround time 중요, 많이 처리하고 끝내는게 중요
    • ex: 대량 계산, 로그처리, 오래걸리는 작업
    • 알고리즘: FCFS사용

queue간의 스케줄링

  • Fixed priority scheduling: foreground를 먼저 다 처리하고, 그 다음 background를 처리

    • 문제점: starvation
  • 여러 queue를 priority 순서로 쌓아두고, 위 queue부터 CPU를 주는 구조”를 보여주는 그림

  • 따라서 아예 큐를 분리해놓으면 누가 우선순위가 높은지 파악하는 오버헤드가 적다

8. MLFQ(Multilevel Feedback Queue)

멀티레벨큐에 aging기법을 큐 차원에서 적용한거

multilevel queue와의 차이점

  • Multilevel Queue: 프로세스가 한 queue에 고정됨

  • Multilevel Feedback Queue: 프로세스가 실행 패턴에 따라 queue 사이를 이동함

흐름

→ 일단 높은 priority에서 실행
CPU를 오래 쓰면 아래로 내림
→ 짧게 쓰고 I/O 하면 위에 둠

그리고 오래 실행안한 큐 우선순위높임
aging기법

9. UNIX 스케줄러

preemptive + priority-based + round-robin + dynamic priority + MLFQ

  • Preemptive: 더 높은 priority process가 오면 현재 process를 끊을 수 있음
  • Priority-based: priority 높은 process 먼저 실행
  • Round-robin: 같은 priority 안에서는 time slice로 번갈아 실행
  • Dynamic priority
    • CPU를 많이 쓰면 priority 감소
    • I/O-bound 또는 interactive process는 priority 우대
  • MLFQ와 유사: process 행동에 따라 priority가 바뀜
  • Aging: 오래 기다린 process의 starvation 방지

10. 멀티프로세서에서 스케줄랑

지금까지는 cpu가 1개일 때만 다뤘는데 cpu가 여러개이면 어떻게 스케줄링해야하지?

P1, P2, P3, P4
CPU0, CPU1, CPU2, CPU3

P1CPU0?
P2CPU1?
→ 아니면 CPU마다 queue를 따로 둘까?
→ 특정 CPU에 일이 몰리면 어떻게 하지?
  • load balance: CPU들 사이에 작업량을 적절히 나눠서, 어떤 CPU는 놀고 어떤 CPU는 바쁘지 않게 하는 것
  • process affinity: 가능하면 같은 프로세스는 같은 cpu에서 돌려야한다. 캐시 때문에

11. NUMA(Non-Uniform Memory Access)

메모리 접근 시간이 균일하지 않음

  • 물리적인 메모리 위치가 어디냐? 이거까지 고려해서 설계해야함
  • Multithreaded multicore는 core 하나를 더 효율적으로 쓰려고 hardware thread를 여러 개 두는 구조이고, 스케줄러는 logical CPU가 진짜 독립 CPU가 아니라는 점을 고려해야 한다.