
🧠 리눅스 프로세스 우선순위 이해하기 — Nice와 Renice 완전 정복
리눅스에서 여러 프로세스가 동시에 실행될 때, 어떤 프로세스가 먼저 CPU를 사용할지 결정하는 핵심 요소가 있습니다.
바로 "프로세스의 우선순위(priority)"이며, 리눅스에서는 이를 nice 값을 통해 제어합니다.
오늘은 nice 값의 개념부터 내부 스케줄링 로직, 그리고 실제 실습 방법까지 단계별로 살펴보겠습니다.
🔍 Nice 값이란?
리눅스의 프로세스 우선순위는 nice
값으로 표현됩니다.
하지만 일반적으로 생각하는 “우선순위 숫자가 높을수록 중요하다”는 개념과는 정반대입니다.
-
Nice 값이 낮을수록 (음수) → 우선순위가 높음 (CPU를 더 많이 점유)
-
Nice 값이 높을수록 (양수) → 우선순위가 낮음 (CPU를 양보)
즉, “nice하다”는 말 그대로 CPU를 양보한다는 의미로 보면 됩니다.
Nice 값 | 설명 | 상대적 우선순위 |
---|---|---|
-20 | 매우 불친절함 → CPU 최우선 점유 | 🔺 높음 |
0 | 기본값 (보통 프로세스) | ⚖️ 보통 |
+19 | 매우 친절함 → CPU 양보 | 🔻 낮음 |
⚙️ Run Queue vs Wait Queue
리눅스에서 프로세스는 실행 상태에 따라 여러 큐(queue) 에 존재할 수 있습니다.
특히 우선순위와 관련된 핵심 개념은 Run Queue입니다.
-
Run Queue: CPU 실행을 기다리거나 실행중인 프로세스들의 목록입니다.
즉, “지금 곧 CPU를 사용할 준비가 된 상태”를 뜻합니다. -
Wait Queue: I/O(네트워크, 디스크 등)를 기다리는 프로세스 목록입니다.
이 상태에서는 Sleep 상태로 I/O 끝나기를 기다리는 상태입니다.
🧩 다중 코어 환경에서의 스케줄링
CPU에 여러 개의 코어가 있다면, 각 코어마다 별도의 Run Queue가 존재합니다.
예를 들어 4코어 CPU라면 Run Queue도 4개가 됩니다.
각 큐에서는 nice 값이 가장 낮은 프로세스(우선순위가 높은 프로세스)가 먼저 선택되어 CPU를 점유한다고 볼 수 있습니다.
하지만 실제로는 단순히 nice 값만으로 결정하지는 않습니다.
리눅스 커널은 버추얼 런타임(Virtual Runtime, vruntime)이라는 값을 함께 고려합니다.
⏱️ Virtual Runtime (Vruntime) 개념
만약 모든 프로세스의 nice 값이 동일하다면, CPU는 어떤 프로세스를 먼저 실행할까요?
결과적으로 보면 CPU 를 실행한시간이 가장 적은 프로세스를 선택합니다.
하지만 nice 와 runtime 을 따로따로 확인하지 않고 vruntime
(버추얼 런타임) 통해서 한번에 확인합니다.
-
Vruntime: 우선순위를 감안한 프로세스 누적 CPU 실행시간
우선순위가 높으면 vruntime 은 느리게 흐르고
우선순위가 낮다면 vruntime 이 빠르게 흐릅니다. 이렇게 우선순위를 감안한 실행시간을 계산하여
Runqueue 에 있는 프로세스중 가장 낮은 vruntime 을 기준으로 다음 CPU 를 점유할 프로세스를 선택합니다.
* 참고: vuntime 은 마치 수능점수를 원점수로만 계산하지않고 표준점수를 통해서 난이도도 함께 감안한 점수로 평가하듯이 우선순위와 실행한시간을 함께 고려하는 통계적인 수치입니다.
이 방식을 통해 리눅스는 “기아(starvation)” 문제 — 즉, 우선순위가 낮은 프로세스가 영원히 CPU를 못 쓰는 상황 — 를 방지합니다.
✅ CFS 스케줄러는 nice 값(우선순위)과 runtime 값(실행한시간) 두 가지를 함께 고려합니다.
🧪 실습: Nice와 Renice 명령어 사용법
이제 실제로 리눅스에서 우선순위를 확인하고 변경해보는 실습을 해보겠습니다.
리얼리눅스 레벨업챌린지 실습("Q7. 프로세스 우선순위 어떻게 바꾸나요?") 예시 입니다.
https://reallinux.co.kr/level-up/p/1/p/1/7/
1️⃣ 프로세스 실행 시 Nice 값 지정
nice -n 10 sleep 300 &
-
nice -n 10
: nice 값을 10으로 지정 (낮은 우선순위) -
sleep 300
: 300초 동안 대기하는 프로세스 실행 -
&
: 백그라운드 실행
2️⃣ 실행 중인 프로세스의 Nice 값 확인
ps -eo pid,ni,cmd --sort=ni
-
pid
: 프로세스 ID -
ni
: nice 값 -
cmd
: 실행된 명령어 -
--sort=ni
: nice 값 기준으로 정렬
3️⃣ 이미 실행 중인 프로세스의 우선순위 변경 (renice)
renice 14 -p 1321
-
1321
: sleep 프로세스의 PID -
renice 14
: 현재 프로세스의 nice 값을 14로 변경
변경 후에는 다시 ps 명령어로 확인할 수 있습니다.
ps -eo pid,ni,cmd --sort=-ni
출력 예시:
PID NI CMD 1321 14 sleep 300
이제 해당 프로세스의 우선순위가 낮아졌음을 확인할 수 있습니다.
🧰 요약: Nice / Renice 한눈에 보기
명령어 | 용도 | 사용 예시 |
---|---|---|
nice |
프로세스 실행 시 우선순위 지정 | nice -n -5 myscript.sh |
renice |
이미 실행 중인 프로세스의 우선순위 변경 | renice 10 -p 1321 |
ps |
프로세스 상태 및 nice 값 확인 | ps -eo pid,ni,cmd |
🚀 마무리
리눅스의 프로세스 우선순위는 단순히 숫자만의 개념이 아니라,
스케줄러가 CPU를 효율적으로 분배하기 위한 복합적인 시스템입니다.
-
nice
값은 프로세스의 “양보도”를 결정하고, -
runtime
은 “얼마나 CPU를 사용했나”를 판단합니다.
이 두 개념이 동시에 vruntime 통해서 판단되고,
리눅스는 수많은 프로세스가 동시에 실행되어도
공정하고 효율적으로 CPU를 관리할 수 있게 됩니다.
🎯 다음 단계:
vruntime
내부 동작이 궁금하다면 리눅스 커널의 CFS(Completely Fair Scheduler) 소스 코드를 읽어보세요.
kernel/sched/fair.c
안에서 vruntime 계산 로직을 직접 확인할 수 있습니다.
추가적으로 리눅스 커널 CFS 스케줄러를 더 공부하고싶다면 리눅스 커널 중급 B를 참고하세요. https://reallinux.co.kr/course/linux_kernel_b