컴퓨터 구조: CPU 스케줄링의 원리와 리눅스의 CFS
|
2 min read
한정된 CPU 자원을 효율적으로 나누기 위한 다양한 스케줄링 알고리즘과, 리눅스 커널이 채택한 CFS(Completely Fair Scheduler)의 작동 방식을 알아봅니다.
1. 프로세스 우선순위와 스케줄링 큐
프로세스는 크게 CPU 연산이 많은 CPU Bound Process와 입출력 작업이 많은 I/O Bound Process로 나뉩니다. 일반적으로 입출력 작업이 많은 프로세스에게 높은 우선순위를 주어, 짧은 시간 동안 CPU를 쓰고 바로 대기 상태로 넘어가게 함으로써 전체 시스템의 응답성을 높입니다.
운영체제는 이러한 프로세스들을 **준비 큐(Ready Queue)**와 **대기 큐(Waiting Queue)**를 통해 관리하며 효율적인 순서를 결정합니다.
2. 대표적인 스케줄링 알고리즘
- 선입 선처리 (FCFS): 먼저 온 순서대로 처리합니다. 앞에 긴 작업이 있으면 뒤가 밀리는 '호위 효과'가 발생할 수 있습니다.
- 최단 작업 우선 (SJF): 실행 시간이 짧은 것부터 처리합니다.
- 라운드 로빈 (RR): FCFS에 '타임 슬라이스' 개념을 더해 정해진 시간만큼만 번갈아 실행합니다. 현대적인 시분할 시스템의 기초입니다.
- 다단계 피드백 큐: 가장 발전된 형태로, 실행 중인 프로세스의 행태를 보고 동적으로 우선순위를 조정합니다.
3. 리눅스의 스케줄링: CFS (Completely Fair Scheduler)
리눅스 커널은 모든 프로세스에게 '공평하게' 기회를 주기 위해 CFS 방식을 사용합니다.
- vruntime (Virtual Runtime): 프로세스가 실제로 실행된 시간을 정규화한 값입니다. CFS는 이 이 가장 적은 프로세스를 다음 실행 대상으로 선택합니다.text
vruntime - Nice 값: 사용자가 프로세스의 우선순위를 조정할 때 사용하는 값으로, 리눅스에서는 -20에서 19 사이의 값을 가집니다. 이 값에 따라 이 쌓이는 속도가 달라져 결과적으로 CPU 점유율이 결정됩니다.text
vruntime