[운영체제+iOS] CPU 스케줄링 (CPU Scheduling)

hye0n.gyu·2025년 12월 17일

운영체제+iOS

목록 보기
2/4
post-thumbnail

⭐ Scheduling이란?

  • 어떻게 Process에게 CPU의 사용을 할당할 것인가
    • Multiprogramming에 기반함
      • Memory 내의 실행 준비된 (Ready State)의 Process들 가운데 하나에게 CPU를 할당함
  • CPU Scheduling의 목표
    - CPU 사용률과 처리량(Throughput) 의 최대화

🧩 Process 수행 사이클의 구성

  • CPU-I/O Burst Cycle
    • CPU Burst: CPU로 연산을 수행하는 시간
    • I/O Burst: I/O 처리를 위해 기다리는 시간
    • 일반적인 프로세스는 두 Burst를 번갈아가며 수행함
  • Process 분류에 따른 CPU Burst의 특징
    • CPU-Bound Process: 짧은 주기의 긴 CPU Burst (CPU 연산 많이)
    • I/O-Bound Process: 긴 주기의 짧은 CPU Burst (I/O 처리 많이)
    • 어떤 종류의 Process가 많은지에 따라 스케줄링 기법의 효율성이 달라짐

서로 다른 Process, System에도 불구하고, 대체적으로 아래와 같은 경향을 보임

해석:
CPU Burst의 대부분은 매우 짧다 (0~2ms 구간 최고 빈도)

  • X축에서 0~2ms 근처에서 빈도가 제일 높음(약 150 이상)
  • 대부분의 프로세스는 CPU를 아주 잠깐만 사용하고 다시 I/O로 넘어간다는 뜻.

→ 현대 운영체제의 일반적인 패턴과 동일

  • 많은 프로세스가 짧은 CPU 작업 + 긴 I/O 대기를 반복한다.

🧩 Scheduling의 종류

  • CPU Scheduling의 결정은 다음 시점에 따라이루어짐 (Process의 context switching 시점)

  1. “Running”에서 “Waiting” 상태로
  2. “Running”에서 “Ready” 상태로
  3. 수행종료
  4. “Ready” 에서 “Running” 상태로
  • 비선점형스케줄링(Non-preemptive Scheduling) - 1과 4 (손, 발이 묶여버림)
    • 1과 4의 상황에서만 수행되는 Scheduling 기법
    • Multiprogramming의 기본 Scheduling – OS가 강제로 CPU 사용을 해제하지 못함
  • 선점형스케줄링(Preemptive Scheduling) - 2 (강제로 Ready로 변경)
    - 그 외의 다른 Scheduling 기법
    - OS가 현재 CPU를 사용하고 있는 Process의 수행을 정지할 수 있음
    2의 상태 변이가 일어남

🧩 Scheduling Criteria

  • CPU 사용률 (CPU Utilization) - 시스템 시간 중 CPU 작업 처리 시간의 비율
  • 처리량(Throughput) - CPU가 단위 시간당 처리하는 프로세스의 개수
  • 응답시간(Response Time)- Interactive System에서 요청 후 첫 응답이 올 때까지의시간
  • 대기시간(Waiting Time) - Process가 Ready Queue 내에서 대기하는 시간의총합
  • Turnaround Time - Process가 시작해서 끝날때까지 걸리는 시간

🧩 Scheduling Algorithms

  • First-Come, First-Served (FCFS) Scheduling : FIFO
  • Shortest-Job-First (SJF) Scheduling : 작은 것 우선
  • Priority Scheduling : 우선 순위
  • Round-Robin (RR) Scheduling : 시분할
  • Multilevel Queue Scheduling : 긴 Job에 더 많은 CPU 자원 할당
  • Multilevel Feedback Queue Scheduling : 긴 Job에 더 많은 CPU 자원 할당

🧩 FCFS (First-Come, First-Served) : 비선점형 스케줄링

먼저CPU할당을요청한 Process에 CPU를 먼저 할당한다.

  • FIFO Queue를 사용하여 간단하게구현가능
  • 작업의 수행 순서에 따라 대기시간이 변할 수 있음

문제 1)

문제 2)


🧩 Shortest Job First Scheduling : 비선점형 스케줄링, 선점형 스케줄링

  • 다음 CPU Burst Time이 가장 짧은 Process에 CPU를 먼저 할당한다.
    • 최소의 평균 대기시간을 제공
  • 비선점형방식
    • 한번CPU를할당받으면자신의CPU Burst Time이끝나기전에는놓지않는다.
  • 선점형방식
    • CPU를 할당받아수행중이더라도 CPU Burst Time이 자신의 현재 남은 시간보다 짧은 시간을
      가진 프로세스가 새로 생성되면 CPU를 양보한다.
    • Shortest Remaining Time First Scheduling (SRTF)

문제 1)


🧩 Priority Scheduling : 비선점형 스케줄링, 선점형 스케줄링

  • 미리 주어진 Priority에 따라 CPU를 할당
    • 비선점형 방식
      • 한 번 CPU를 할당 받으면 자신의 CPU Burst Time이 끝나기 전에는 놓지 않는다.
    • 선점형 방식
    • 새로 생성된 Process가 현재 실행되는 Process보다 높은 Priority를 가지고 있을 경우, CPU를 양보한다.
  • 문제점
    • 기아 상태(Starvation)
      • 낮은Priority를 가진 Process는 전혀 수행되지않을수있다.
  • 해결 방법
    • Aging 기법
      • 할당을 기다리는 시간에 따라 Priority를 증가시켜 주는 방법

🧩 Round Robin Scheduling : 선점형 스케줄링

  • CPU를 시간 단위(Time Quantum)로 할당
  • 선점형Scheduling 방식
    - 보통Time Quantum은 10 – 100 milliseconds
    - Time Quantum만큼 수행 한 Process는 Ready Queue의 끝으로 들어가 다시 할당을 기다림
  • Ready Queue 내의 Process
    • n개
  • Time Quantum
    • q 시간
  • 각각의Process가할당받는시간
    • 1/n 만큼의 CPU 시간을 q로 쪼개어 할당받음
  • 각Process의 다음 Time Quantum이돌아오기까지의 대기시간
    • 최대(n-1) x q
  • 성능
    • q가 클 경우: FCFS
    • q가 작을 경우: 문맥전환(Context Switching)에 필요한 시간보다 낮다면 효율이 매우 떨어짐

🧩 Multilevel Queue Scheduling

  • Ready Queue를 여러 개의 Queue로 분리하여, 각각에 대해 다른 Scheduling Algorithm을 사용하는 기법
  • Foreground Queue
    • Interactive한 동작이 필요한 Process를 위한 Queue
    • Round Robin 기법 사용
  • Background Queue
    • CPU 연산 작업을주로수행하는Process를위한Queue
    • FCFS 기법 사용
  • 각 Queue에 CPU를 어떻게 할당할 것인지를 결정해야 함
    • Queue에 대한 Priority 또는 Time Slice를 사용할 수 있음


🧩 Multilevel Feedback Queue Scheduling - Aging의 한 방법

  • Multilevel Queue에서 Process들이 서로 다른 Queue로 이동할 수 있도록 한 Scheduling 기법
    • Aging의 한 방법으로 사용됨
  • 필요한 요소들
    • Queue의 개수
    • 각 Queue마다의 Scheduling 기법
    • 언제 Process를 한 단계 높은 Queue로 옮길 것인가
    • 언제 Process를 한 단계 낮은 Queue로 옮길 것인가
    • 어떤 Process가 특정한 Service를 필요로 할 때 그것을 제공하는 Queue로 옮겨줄 방법


🧩 Multilevel Feedback Queue Scheduling 예

  • 3 Level Feedback Queue Scheduling
    • Q0 – Time Quantum 8 Miliseconds
    • Q1 – Time Quantum 16 Miliseconds
    • Q2 - FCFS
  • 새로운 Process가 들어오면,
    • Q0에서8 ms 동안 수행됨
    • 1에서종료되지않았다면Q1으로이동, 16 ms 동안수행됨
    • 2에서도종료되지않으면, Q2으로이동, FCFS로수행됨
  • 즉, 생성되고8 + 16 ms 동안 종료되지않은 Process는 많은 CPU 작업을 필요로
    하는 Process로 간주하여 FCFS기법을 이용해 충분한 CPU Time을 할당해주는
    Scheduling 방법이다.

🧩 4 Multiple Processor Scheduling의 구분

  • 여러 개의 CPU를 사용하는 System의 경우, CPU Scheduling은 더욱 복잡해진다.

    • 각각의 CPU에 서로 다른 I/O장치가 연결되어 있다면?
    • 각각의 CPU가 서로 다르다면? (명령어 셋, 처리 속도)

🧩 비대칭 멀티 프로세싱 vs. 대칭 멀티 프로세싱

비대칭 멀티 프로세싱 (Asymmetric Multiprocessing)

프로세서들간에 master-slave 관계가 있다. 마스터 프로세서가 슬레이브 프로세서에 작업을 할당하고 관리한다.

  • 하나의 CPU만이 시스템 자료구조(Scheduling, I/O 작업, 등) 관리
  • 모든 CPU가 접근할 경우보다 데이터공유가 간단히 이루어짐
    • Kernel Multithread 지원이 안 되는 경우

대칭 멀티 프로세싱(Symmetric Multiprocessing)

주종 관계가 없이, 모든 프로세서들이 동일한 peer로 동작한다. 각 프로세서는 다른 프로세서의 간섭 없이 각자 자신의 작업을 수행한다. N개의 cpu가 있으면 성능을 크게 저하하지 않으면서 N개의 프로세스를 실행한다.

⭐ iOS에서의 CPU 스케줄링


🧩 XNU 커널

iOS는 XNU(X is Not Unix) 커널을 사용한다. macOS와 동일한 커널로, Mach 마이크로커널과 BSD를 결합한 하이브리드 구조다. CPU 스케줄링은 Mach 레이어에서 담당하며, 약 128개의 우선순위 레벨을 내부적으로 관리한다.

🧩 iOS는 어떤 스케줄링을 사용할까?

iOS(XNU 커널)는 Multilevel Feedback Queue 기반의 스케줄링을 사용한다. 이를 QoS(Quality of Service)라는 형태로 개발자에게 제공한다.

QoS대응되는 개념용도
.userInteractiveForeground Queue (높은 우선순위)UI 업데이트, 애니메이션
.userInitiatedForeground Queue사용자가 즉시 결과를 기대하는 작업
.default중간 Queue일반적인 작업
.utilityBackground Queue프로그레스 바가 있는 작업
.backgroundBackground Queue (낮은 우선순위)백업, 동기화

🧩 Main Thread와 스케줄링

Main Thread는 기본적으로 .userInteractive 우선순위를 가진다. CPU 스케줄러가 항상 최우선으로 처리하기 때문에, Background 작업이 많아도 UI가 버벅이지 않는다.

[Main Thread]        QoS: .userInteractive  →  CPU 우선 할당
[Background Thread]  QoS: .background       →  CPU 여유 있을 때 실행

🧩 선점형 스케줄링과 iOS

iOS는 선점형 스케줄링을 사용한다. 높은 우선순위의 작업이 들어오면 낮은 우선순위 작업을 중단하고 CPU를 양보하게 된다. 덕분에 Background에서 무거운 연산을 돌려도 사용자 터치 반응은 즉각적으로 처리된다.


🧩 실무에서의 활용

// 무거운 작업은 낮은 우선순위로
DispatchQueue.global(qos: .utility).async {
    let data = processLargeFile()
    
    // UI 업데이트는 최우선으로
    DispatchQueue.main.async {
        self.updateUI(with: data)
    }
}

우선순위가 낮으면 CPU 시간을 덜 받아서 작업이 느려질 수 있다. 하지만 그게 의도된 동작이다. 사용자 입장에서는 UI가 버벅이는 게 더 불쾌하고, 백그라운드 작업이 조금 더 걸리는 건 체감하기 어렵기 때문이다.

profile
반려묘 하루 velog

0개의 댓글