# CPUScheduling

## CPU 스케줄링이란 무엇인가요?

* [CPU 스케줄링](https://github.com/genesis12345678/TIL/blob/main/OS/cpuScheduling/Scheduling.md#cpu-scheduling)이란 작업을 처리하기 위해서 프로세스들에게 CPU를 할당하기 위한 정책을 계획하는 것이다.
* CPU 스케줄링 대상 프로세스는 `Ready Queue`에 있는 프로세드들로, 스케줄링 정책에 따라 `Queue`에 정렬한 후 앞에 있는 프로세스부터 CPU를 주게 된다.
* **스케줄링이 필요한 이유**
  * CPU를 효율적으로 사용하기 위해서는 프로세스들을 잘 배정해야 한다.
  * 이를 위해서 `Ready Queue`에 있는 프로세스를 대상으로 CPU를 할당받는 순서와 방식을 결정하는 것이다.

\\

## CPU 스케줄링 방법에는 어떤 것들이 있나요?

1. **비선점**
   * 프로세스 종료 또는 입출력 등의 이벤트가 있을 때까지 실행을 보장한다.
   * **장점**
     * 모든 프로세스들에게 공정하다.
     * 응답 시간을 예측할 수 있다.
   * **단점**
     * 짧은 작업을 수행하는 프로세스라도 긴 작업이 종료될 때까지 기다려야 한다.
2. **선점**
   * `OS`가 CPU의 사용권을 선점할 수 있는 경우에 강제로 회수한다.
   * **장점**
     * 높은 우선 순위를 가진 프로세스를 빠르게 처리하려는 시스템에 유용하다.
     * 빠른 응답 시간을 요구하는 시분할 시스템에 유용하다.
   * **단점**
     * 높은 우선 순위를 가진 프로세스들만 들어오는 경우 오버헤드가 발생한다.
3. **FCFS(First Come First Served)**
   * 큐에 도착한 순서대로 CPU를 할당한다.
4. **SJF(Shortest Job First)**
   * FCFS 알고리즘을 보완하기 위해서 만들어졌다.
   * 수행 시간이 가장 짧다고 판단되는 작업을 우선 수행한다.
   * 평균 대기 시간이 짧으므로 짧은 작업에 유리하지만, 사용 시간이 긴 프로세스는 영원히 CPU를 할당 받지 못할 수 있다.(기아 현상 : Starvation)
5. **HRN(Highest Response-ratio Next)**
   * 점유 불평등 현상이 발생하는 SJF 알고리즘을 보완하기 위해 만들어졌다.
   * **우선순위**를 계산하여 동작한다.
   * 우선순위 : **(대기 시간 + 실행 시간) / 실행 시간**
6. **SRTF(Shortest Remaining Time First)**
   * 현재 수행 중인 프로세스의 남은 `burst time`보다 더 짧은 `CPU burst time`을 가진 새로운 프로세스가 도착할 경우 CPU를 강제로 회수한다.
   * 새로운 프로세스가 도달할 때마다 스케줄링을 다시 하기 때문에 CPU 사용 시간을 측정할 수 없고, `Starvation` 현상이 발생할 수 있다.
7. **Round Robin**
   * FCFS에 의해 프로세스를 받아 각 프로세스에 동일한 시간의 `Time Quantum` 만큼 CPU를 할당한다.
     * `Time Quantum(Time Slice)` : 실행의 최소 시간 단위
   * 현대적인 CPU 스케줄링 방식이며, 할당 시간이 끝나면 프로세스는 `Ready Queue`의 제일 뒤에 삽입된다.
   * CPU 사용 시간이 랜덤한 프로세스들이 섞여 있을 경우에 효율적이고, 프로세스의 `Context`를 저장할 수 있다.
