프로세스 스케줄러

CPU를 누구에게 얼마나 줄 것인가

프로세스가 여러 개일 때 CPU를 분배하는 역할이 스케줄러다. 각 프로세스에게 타임 슬라이스만큼 CPU를 주고 교체하며, 우선순위(nice 값)로 중요도를 조절한다. Linux의 CFS는 각 프로세스가 실제로 CPU를 얼마나 썼는지 추적해서 가장 적게 쓴 쪽에 CPU를 주는 방식으로 공평함을 구현한다.

Process

개념

프로세스가 여러 개 대기 중인데 CPU 코어는 한정되어 있다. 누구한테 CPU를 얼마나 줄 것인가를 결정하는 게 스케줄러다. 타이머 인터럽트가 걸리면 커널이 스케줄러를 호출하고, 스케줄러가 다음에 돌릴 프로세스를 골라서 컨텍스트 스위칭을 수행한다.

타임 슬라이스

각 프로세스에게 CPU를 주는 시간 단위다. "10ms 쓰고 다음 사람한테 넘겨" 같은 식이다.

  • 타임 슬라이스가 길면 — 컨텍스트 스위칭이 적어서 효율적이지만, 다른 프로세스가 오래 기다림
  • 타임 슬라이스가 짧으면 — 반응성은 좋은데, 스위칭 비용이 커짐

이 트레이드오프가 스케줄러 설계의 핵심 축이다.

우선순위

모든 프로세스가 평등하진 않다. 시스템 프로세스가 사용자 프로세스보다 먼저 돌아야 하고, 키보드 입력 같은 건 빠르게 반응해야 한다.

Linux에서는 nice 값으로 우선순위를 조절한다. 범위는 -20(최고 우선순위) ~ 19(최저). nice 값이 높을수록 "양보를 잘 하는 착한 프로세스"라는 뜻이다.

nice -n 10 python heavy_task.py  # 낮은 우선순위로 실행

CFS (Completely Fair Scheduler)

Linux가 실제로 쓰는 스케줄러다. 이름 그대로 완전히 공평하게 CPU를 나누겠다는 발상이다.

각 프로세스마다 지금까지 CPU를 얼마나 썼는지(vruntime) 를 추적하고, 항상 가장 적게 쓴 프로세스에게 CPU를 준다.

  • A가 10ms, B가 3ms 썼으면 → B한테 줌
  • B가 7ms까지 쓰면 → 다시 비교해서 적은 쪽에 줌

Round Robin처럼 무조건 돌아가면서 주는 게 아니라, 실제 사용량을 보고 뒤처진 쪽을 먼저 채워주는 방식이다.

우선순위(nice)가 높은 프로세스는 vruntime이 더 느리게 증가해서 CPU를 더 오래 받을 수 있다. 시간을 실제보다 천천히 세는 셈이라 스케줄러 눈에는 "아직 덜 썼네" 하고 더 자주 골라준다.

더 보기

sunshinemoon · 2026