200===Dev Language/DS And Algorithm

라운드 로빈(Round Robin) 스케줄링

블로글러 2025. 2. 9. 10:49

오늘은 라운드 로빈(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. 라운드 로빈의 장점 🌟

  1. 공평성(Fairness)

    • 모든 프로세스가 동등한 기회를 얻어 CPU를 사용할 수 있습니다.
    • 어떤 프로세스도 너무 오랫동안 대기하지 않게 됩니다.
  2. 응답 시간(Response Time) 향상

    • 한 프로세스가 오랫동안 CPU를 독점할 수 없으니, 모든 프로세스가 빠른 시점에 한 번씩은 실행 기회를 얻습니다.
  3. 단순 구현

    • 준비 큐(Ready Queue)에 프로세스가 쌓이고, 타임 슬라이스가 끝날 때마다 맨 뒤로 보내는 구조이므로, 비교적 구현이 간단합니다.

4. 주의할 점 ⚠️

  1. 타임 슬라이스(Time Quantum) 설정

    • 너무 길면? → 라운드 로빈이 아니라 거의 FCFS(First Come First Served)와 비슷해져서, 한 프로세스가 긴 시간 CPU를 독점하는 상황이 생김.
    • 너무 짧으면? → CPU 스위칭(문맥 전환)이 잦아져서 오버헤드(전환 비용)가 증가합니다.
  2. 우선순위 고려가 어려움

    • 라운드 로빈은 모든 프로세스에게 동등한 시간을 주기 때문에, 긴급하게 처리해야 하는 프로세스가 있더라도 우선 처리하기가 쉽지 않습니다.
  3. 문맥 전환(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 할당을 모두 달성할 수 있습니다!


참고 자료 및 출처

  1. Operating System Concepts – A. Silberschatz, P. Galvin, G. Gagne
  2. 라운드 로빈 스케줄링위키백과
  3. 각종 OS 강의 자료 및 블로그

결론: 라운드 로빈은 “모두에게 2분씩, 순서대로 돌아가며 발표 기회 제공” 같은 개념!
CPU를 독점하지 않고, 최대한 빠른 시간 안에 응답을 받을 수 있도록 해줍니다.

728x90