# 스케줄링: 비례 배분(Proportional Share)[^sadey7645][^Gyu-BBB]

[^sadey7645]: [김진우](https://github.com/sadey7645)
[^Gyu-BBB]: [이규범](https://github.com/Gyu-BBB)

비례 배분은 반환 시간이나 응답 시간을 최적화하는 대신 스케줄러가 각 작업에게 CPU의 일정 비율을 보장하는 것이 목적입니다.

비례 배분 스케줄링의 좋은 예시는 Waldspurger와 Weihl의 연구입니다. 이 방법은 추첨 스케줄링(Lottery Scheduling)으로도 알려져 있는데요. 이 아이디어는 꽤 오래되었고, 기본 아이디어는 매우 간단합니다. 다음으로 실행될 프로세스를 추첨을 통해 결정하고, 더 자주 수행되어야 하는 프로세스는 당첨 기회를 더 많이 주면 되는겁니다. 이에 대한 자세한 사항을 알아보기 전에 문제를 먼저 살펴봅시다.

> **핵심 질문: 어떻게 CPU를 정해진 비율로 배분할 수 있는가**
>
> 특정 비율로 CPU를 배분하는 스케줄러를 어떻게 설계할 수 있을까요?
> 그리고 그렇게 하기 위한 중요한 기법은 무엇이며 그 기법은 얼마나 효과적인가요?

## 기본 개념 : 추첨권이 당신의 몫을 나타낸다

스케줄링에서 비례 배분은 시스템 리소스를 사용하는 여러 프로세스 또는 작업 간에 리소스를 공정하게 나누는 방법이다.  
이것은 각 프로세스가 추첨권을 할당받아 리소스에 대한 접근을 결정하는데 사용된다.  
추첨권은 각 프로세스의 상대적인 우선순위를 나타낸다.

### 개념 설명

각 프로세스에는 일정한 비율의 '티켓(ticket)' 또는 '가중치(weight)'가 할당된다.  
프로세스의 상대적 중요도가 높을수록 더 많은 티켓이 할당된다.  
CPU 스케줄러는 프로세스들의 누적 티켓 수에 비례하여 CPU 시간을 할당한다.  
예를 들어 프로세스 A가 4개의 티켓, 프로세스 B가 2개의 티켓을 가지면, A는 2배 많은 CPU 시간을 할당받게 된다.

### 특징

- 공평성(Fairness): 모든 프로세스가 자신의 비율에 따라 공평하게 자원을 받을 수 있도록 보장한다. 이는 특정 작업이 자원을 독점하는 것을 방지한다.
- 유연성(Flexibility): 프로세스의 우선순위 변경이 용이하며, 새로운 프로세스의 추가 시에도 유연하게 대응할 수 있다. 시스템의 변화하는 요구사항에 맞추어 자원 분배 비율을 조정할 수 있다.
- 상대적 중요도: 프로세스의 상대적 중요도를 티켓 수로 표현하여, CPU 사용 시간을 결정한다. 티켓의 비율에 따라 CPU 시간을 비례적으로 분배한다.

## 추첨 기법

비례 배분 스케줄링에서 CPU 시간을 할당하기 위해 사용되는 기법은 '추첨(lottery)' 방식이다.  
이 방식에서는 각 프로세스에게 할당된 티켓 수에 비례하여 CPU 시간이 할당된다.

추첨 과정은 다음과 같이 이루어진다.

1. 각 프로세스에게 상대적 중요도에 따라 티켓이 할당된다.
2. 스케줄러는 프로세스들의 전체 티켓 수를 계산한다.
3. 스케줄러는 전체 티켓 수 범위 내에서 무작위로 한 번호를 선택한다.
4. 선택된 번호가 속한 프로세스에게 CPU 시간이 할당된다.
5. 이 과정을 주기적으로 반복하여 CPU 시간을 할당한다.

예를 들어, 다음과 같이 3개의 프로세스가 있다고 가정한다.

| 프로세스 | 티켓 수 |
| -------- | ------- |
| A        | 4       |
| B        | 2       |
| C        | 1       |

이 경우 전체 티켓 수는 7이다. 스케줄러가 1부터 7 사이의 숫자 중 하나를 무작위로 선택한다고 가정하면.

- 1, 2, 3, 4 중 하나가 선택되면 프로세스 A에게 CPU 시간이 할당된다.
- 5, 6이 선택되면 프로세스 B에게 CPU 시간이 할당된다.
- 7이 선택되면 프로세스 C에게 CPU 시간이 할당된다.

이렇게 무작위로 번호를 선택하고 해당 프로세스에 CPU 시간을 할당하는 과정을 주기적으로 반복함으로써, 프로세스의 티켓 수 비율에 따라 CPU 시간이 비례적으로 할당된다.

이 추첨 방식은 프로세스의 상대적 중요도를 티켓 수로 표현하고, 무작위성을 기반으로 하여 CPU 시간을 공정하게 분배할 수 있다.

## 구현

비례 배분 스케줄링을 구현하는 대표적인 알고리즘으로 '티켓 기반 추첨(Ticket-Based Lottery)' 알고리즘이 있다.

1. 각 프로세스에게 상대적 중요도에 따라 일정 수의 '티켓'을 할당한다.
2. 전체 티켓 수를 계산한다.
3. 0부터 전체 티켓 수 범위 내에서 무작위로 한 번호를 추첨한다.
4. 선택된 번호가 속한 프로세스에게 CPU 시간을 할당한다.
5. 주기적으로 3, 4번 단계를 반복하여 CPU 시간을 할당한다.

예를 들어, 다음과 같이 3개의 프로세스가 있다고 가정한다.

| 프로세스 | 티켓 수 | CPU 사용 시간 |
| -------- | ------- | ------------- |
| A        | 4       | 200ms         |
| B        | 2       | 100ms         |
| C        | 1       | 50ms          |

이 경우 전체 티켓 수는 7이다. 스케줄러가 1부터 7 사이의 숫자 중 하나를 무작위로 선택한다고 가정하면

- 1, 2, 3, 4 중 하나가 선택되면 프로세스 A에게 200ms의 CPU 시간이 할당된다.
- 5, 6이 선택되면 프로세스 B에게 100ms의 CPU 시간이 할당된다.
- 7이 선택되면 프로세스 C에게 50ms의 CPU 시간이 할당된다.

다음과 같은 과정을 주기적으로 반복하여 각 프로세스에게 할당된 CPU 시간의 합이 티켓 수 비율과 일치하도록 한다.

이처럼 티켓 기반 추첨 알고리즘은 프로세스의 상대적 중요도를 티켓 수로 표현하고, 무작위성을 기반으로 CPU 시간을 공정하게 할당할 수 있다.  
이 알고리즘은 비례 배분 스케줄링의 핵심 아이디어를 구현하는 대표적인 방식으로 프로세스의 상대적 중요도를 티켓 수로 표현하고, 무작위성을 기반으로 CPU 시간을 공정하게 할당할 수 있다.

## 장단점

### 장점

프로세스의 상대적 중요도를 유연하게 반영할 수 있다.
새로운 프로세스 추가 시 간단히 티켓 수를 조정하는 것만으로 대응할 수 있다.
장기적으로는 각 프로세스에게 공정한 CPU 시간 할당을 보장한다.

### 단점

단기적으로는 무작위성으로 인해 공정성이 다소 저해될 수 있다.
추첨 과정에서 오버헤드가 발생할 수 있다.

## 예제

시스템에 3개의 프로세스 (A, B, C) 가 있고, 각각에게 다음과 같이 티켓이 할당되어 있다고 가정한다.

- 프로세스 A: 6 티켓
- 프로세스 B: 3 티켓
- 프로세스 C: 1 티켓

이 상황에서 전체 티켓 수는 10개가 된다. 이러한 상황에서 CPU 시간의 할당 과정은 다음과 같이 이루어진다.

1. **티켓 할당**: 시스템은 각 프로세스의 중요도에 따라 티켓을 할당한다. 중요도가 높은 프로세스일수록 더 많은 티켓을 받게 되며, 이는 해당 프로세스가 CPU 시간을 할당받을 확률을 증가시킨다.

2. **추첨 과정**: 스케줄러는 1부터 10 사이의 숫자 중에서 무작위로 하나를 선택한다. 선택된 숫자는 각 프로세스가 할당받은 티켓 번호 범위 내에서 선택된다.

---

> - 숫자 2가 선택되면, 이는 프로세스 A가 할당 받는다. (프로세스 A는 1~6 번호를 가지고 있음).
> - 숫자 8이 선택되면, 이는 프로세스 B가 할당 받는다. (프로세스 B는 7~9 번호를 가지고 있음).
> - 숫자 10이 선택되면, 이는 프로세스 C가 할당 받는다. (프로세스 C는 10번 번호를 가지고 있음).

---

3. **CPU 시간 할당**: 선택된 프로세스는 CPU 시간을 할당받아 작업을 수행한다. 이 과정은 시스템이 효율적으로 작동하도록 지속적으로 반복된다.

이러한 추첨 과정은 각 프로세스가 CPU 시간을 공정하게 받을 수 있도록 한다. 장기적으로 볼 때, 프로세스 A는 전체 CPU 시간의 대략 60%, 프로세스 B는 30%, 그리고 프로세스 C는 10%를 받게 된다. 이는 각 프로세스에 할당된 티켓 수에 비례한다.

## 요약

비례 배분 스케줄링은 다양한 프로세스나 작업 간에 시스템 리소스를 공정하게 분배하는 방법으로, 각 프로세스에 상대적 중요도에 따라 티켓 또는 가중치를 할당합니다. 이는 마치 추첨권을 받는 것과 비슷한데, 추첨권의 수가 각 프로세스의 상대적 중요도를 나타냅니다. 이후 CPU 스케줄러는 각 프로세스의 티켓 수에 비례하여 CPU 시간을 할당하게 됩니다. 이를 통해 상대적 중요도가 높은 프로세스가 더 많은 CPU 시간을 할당받게 되는데, 이는 각 프로세스의 상대적 중요도를 공정하게 반영합니다.
이 방식의 주요 특징은

프로세스의 상대적 중요도 반영: 각 프로세스에 할당된 티켓 수는 해당 프로세스의 상대적 중요도를 나타내므로, CPU 시간 할당이 이에 비례하여 이루어집니다.

유연성: 프로세스의 상대적 중요도를 조정하기 쉽습니다. 새로운 프로세스가 추가되거나 우선순위가 변경될 때, 간단히 티켓 수를 조정함으로써 대응할 수 있습니다.

공정성: 장기적으로는 각 프로세스에게 공정한 CPU 시간 할당을 보장합니다. 즉, 시간이 지남에 따라 각 프로세스는 할당된 CPU 시간의 비율에 따라 공정하게 실행됩니다.

그러나 단기적으로는 무작위성으로 인해 공정성이 다소 저해될 수 있고, 추첨 과정에서 추가적인 오버헤드가 발생할 수 있습니다.

이러한 방식은 각 프로세스의 우선순위를 유연하게 반영하며, 시스템의 요구사항과 우선순위에 유연하게 대응할 수 있는 효율적인 자원 관리를 가능하게 합니다. 따라서 비례 배분 스케줄링은 다양한 환경에서 자원 관리의 효율성과 공정성을 동시에 보장하는 중요한 방법 중 하나입니다.
