오늘은 라운드 로빈(Round Robin) 정책을 쉽고, 직관적으로 이해하고 활용할 수 있도록 정리해보겠습니다!
1. 라운드 로빈이란? 🤔
라운드 로빈(Round Robin)을 한마디로 정의하면 “순서대로 돌아가며 동일한 시간만큼 CPU를 사용하는 스케줄링 방식”입니다.
쉽게 떠올릴 수 있는 비유
노래방 마이크 돌리기
- 친구들과 노래방에 갔을 때, 한 사람만 계속 노래를 부르면 다른 친구들이 지루해지겠죠? 대신 2절까지 불렀다면 마이크를 옆 친구에게 넘기고, 그 친구가 2절을 부르면 다음 친구에게 넘어가는 식으로 “차례를 공평하게 나누는” 상황을 떠올릴 수 있습니다.
모둠 발표 시간
- 학교에서 5개 모둠이 각각 발표를 해야 할 때, 각 모둠에게 5분씩만 우선 주고 발표하다가 시간이 부족하면 다시 차례가 돌아올 때 더 발표하는 방법도 라운드 로빈과 유사합니다.
이런 식으로 각 프로세스(노래 부르는 사람, 모둠 등)에 동등하게 시간을 주되, 시간이 끝나면 다음 순서로 넘어가는 방식을 라운드 로빈이라고 해요.
2. 어떻게 동작하나요? 🎬
1) 기본 개념 - ‘타임 슬라이스(Time Quantum)’
- 타임 슬라이스: 한 번에 CPU(마이크, 발표 시간 등)를 점유할 수 있는 고정된 시간입니다.
- 예를 들어 타임 슬라이스를 2초로 정했다면, 프로세스 A가 2초 동안 작업을 하다가 시간이 끝나면 바로 프로세스 B로 넘어갑니다.
2) 간단한 예시 상황
- 프로세스(P1, P2, P3, P4)가 있고, 각자 필요한 CPU 사용 시간(작업 시간)이 다음과 같다고 해봅시다.
- P1: 6초 필요
- P2: 3초 필요
- P3: 5초 필요
- P4: 2초 필요
- 타임 슬라이스 = 2초
시간표로 살펴보기
아래 표는 시간 흐름에 따라 어떤 프로세스가 2초씩 CPU를 할당받는지를 보여줍니다.
시간(구간) | 실행 프로세스 | 해당 구간 후 남은 시간 | 설명 |
---|---|---|---|
0 ~ 2 | P1 | P1: 4, P2: 3, P3: 5, P4: 2 | P1이 2초 사용 후 남은 시간 4초 |
2 ~ 4 | P2 | P1: 4, P2: 1, P3: 5, P4: 2 | P2가 2초 사용 후 남은 시간 1초 |
4 ~ 6 | P3 | P1: 4, P2: 1, P3: 3, P4: 2 | P3가 2초 사용 후 남은 시간 3초 |
6 ~ 8 | P4 | P1: 4, P2: 1, P3: 3, P4: 0 (완료) | P4가 2초 사용 후 완료됨 (남은 시간 0) |
8 ~ 10 | P1 | P1: 2, P2: 1, P3: 3, P4: 완료 | 다시 P1 차례, 2초 사용 후 남은 시간 2초 |
10 ~ 12 | P2 | P1: 2, P2: 0 (완료), P3: 3 | P2가 2초 사용 후 완료 |
12 ~ 14 | P3 | P1: 2, P3: 1, P4: 완료 | P3가 2초 사용 후 남은 시간 1초 |
14 ~ 16 | P1 | P1: 0 (완료), P3: 1, P4: 완료 | P1이 2초 사용 후 완료 |
16 ~ 17 | P3 | P3: 0 (완료) | 마지막으로 남은 P3가 1초 더 사용하고 완료 |
이렇게 정해진 2초마다 프로세스가 CPU를 교대로 사용하며, 남은 시간이 있으면 대기열의 맨 뒤로 돌아갑니다.
3. 라운드 로빈의 장점 🌟
공평성(Fairness)
- 모든 프로세스가 동등한 기회를 얻어 CPU를 사용할 수 있습니다.
- 어떤 프로세스도 너무 오랫동안 대기하지 않게 됩니다.
응답 시간(Response Time) 향상
- 한 프로세스가 오랫동안 CPU를 독점할 수 없으니, 모든 프로세스가 빠른 시점에 한 번씩은 실행 기회를 얻습니다.
단순 구현
- 준비 큐(Ready Queue)에 프로세스가 쌓이고, 타임 슬라이스가 끝날 때마다 맨 뒤로 보내는 구조이므로, 비교적 구현이 간단합니다.
4. 주의할 점 ⚠️
타임 슬라이스(Time Quantum) 설정
- 너무 길면? → 라운드 로빈이 아니라 거의 FCFS(First Come First Served)와 비슷해져서, 한 프로세스가 긴 시간 CPU를 독점하는 상황이 생김.
- 너무 짧으면? → CPU 스위칭(문맥 전환)이 잦아져서 오버헤드(전환 비용)가 증가합니다.
우선순위 고려가 어려움
- 라운드 로빈은 모든 프로세스에게 동등한 시간을 주기 때문에, 긴급하게 처리해야 하는 프로세스가 있더라도 우선 처리하기가 쉽지 않습니다.
문맥 전환(Context Switch) 오버헤드
- 프로세스가 자주 바뀌므로, 각 전환 시점마다 리소스가 소모되고 처리 시간이 약간씩 손실될 수 있습니다.
5. 직관적으로 활용하는 방법 📱
“내가 관리해야 할 작업(프로세스)이 여러 개 있는데, 모든 작업을 멈추지 않고 조금씩이라도 동시에 돌리고 싶다”면, 라운드 로빈 기법을 생각해볼 수 있습니다.
/**
* Round Robin 스케줄링 예시 (간단 버전)
*/
public class RoundRobinExample {
private static final int TIME_QUANTUM = 2; // 라운드 로빈 타임 슬라이스
public static void main(String[] args) {
// 각 프로세스: {이름, 남은 실행 시간}
List<Process> processes = new ArrayList<>();
processes.add(new Process("P1", 6));
processes.add(new Process("P2", 3));
processes.add(new Process("P3", 5));
processes.add(new Process("P4", 2));
Queue<Process> readyQueue = new LinkedList<>(processes);
int currentTime = 0;
while (!readyQueue.isEmpty()) {
Process current = readyQueue.poll();
int execTime = Math.min(current.remainingTime, TIME_QUANTUM);
// execTime만큼 실행
current.remainingTime -= execTime;
currentTime += execTime;
System.out.println(
currentTime + "초 시점 - " + current.name
+ " 실행, 남은 시간: " + current.remainingTime
);
if (current.remainingTime > 0) {
// 아직 끝나지 않았다면 큐의 맨 뒤로 보냄
readyQueue.offer(current);
} else {
System.out.println(">> " + current.name + " 완료!");
}
}
System.out.println("모든 프로세스가 완료되었습니다. 총 소요 시간: " + currentTime + "초");
}
static class Process {
String name;
int remainingTime;
Process(String name, int remainingTime) {
this.name = name;
this.remainingTime = remainingTime;
}
}
}
이런 식으로 각 프로세스가 2초씩 번갈아가며 실행되는 상황을 간단히 시뮬레이션할 수 있습니다.
6. 마치며 🎁
정리하자면, 라운드 로빈(Round Robin) 스케줄링은 한 프로세스가 CPU를 독점하지 않도록 타임 슬라이스만큼만 CPU를 사용하게 하고, 그 시간이 끝나면 다음 프로세스로 교체하는 매우 공정한 방식입니다.
- 직관적으로 생각하면, 모두에게 골고루 기회를 주고자 할 때 쓸 수 있는 스케줄링
- 중요한 점: 타임 슬라이스를 너무 크게 잡으면 “돌려가며”의 이점이 줄어들고, 너무 작으면 문맥 전환이 과다해져서 효율이 떨어질 수 있음
이 기술을 활용하면, 여러 작업을 동시에 처리해야 하는 상황에서 빠른 응답과 공평한 CPU 할당을 모두 달성할 수 있습니다!
참고 자료 및 출처
- Operating System Concepts – A. Silberschatz, P. Galvin, G. Gagne
- 라운드 로빈 스케줄링 – 위키백과
- 각종 OS 강의 자료 및 블로그
결론: 라운드 로빈은 “모두에게 2분씩, 순서대로 돌아가며 발표 기회 제공” 같은 개념!
CPU를 독점하지 않고, 최대한 빠른 시간 안에 응답을 받을 수 있도록 해줍니다.
'200===Dev Language > DS And Algorithm' 카테고리의 다른 글
정렬 알고리즘(Sorting Algorithm) 😋 (1) | 2025.02.03 |
---|---|
문제 빠르게 파악하고 이해하기 📚 (0) | 2024.10.31 |
알고리즘 문제 빠르게 파악하는 전략 🎯 (0) | 2024.10.31 |
문제 해결의 마법 🧙♂️ - 더 똑똑하게 문제 해결하기 (0) | 2024.10.30 |
슬라이딩 윈도우(Sliding Window) 완전 정복! 🪟 (0) | 2024.10.30 |