운영체제는 다양한 프로세스와 스레드에 CPU 사용량을 분배합니다!
CPU의 배분 방법이 바로 CPU 스케줄링이며, CPU스케줄링 알고리즘은 바로 이 스케줄링의 절차를 말합니다
CPU의 알고리즘을 결정하고 수행하는 운영체제 일부분을 CPU스케줄러라고합니다.
실행의 문맥이 있다면 모두 스케줄링의 대상이다.
모든 프로레스는 자원을 받아서 활동하고, 자원을 필요로 합니다.
때문에 매우 공정한 방법으로 이 자원을 프로세스들에게 할당해야합니다.
CPU의 배분은 단순하게 돌아가면서 너 받아 하는 것이 아닙니다. 이러한 것들 모두 우선순위가 다르기 때문에 운영체제
프로세스는 우선순위를 둡니다.
PCB에 명시하고, 우선순위가 높은 프로세스에는 CPU의 자원을 더 빨리 더 많이 생성해줍니다.
사용자가 직접 프로세스의 우선순위를 높일 수도있습니다! 운영체제마다 우선순위를 확인 할 수 있는 방법을 제공하는데
유닉스 리눅스 맥OS등의 운영체제에서는 ps명령어를 통해 다음과 같이 우선 순위를 확인이 가능합니다.

이런식으로 PRI 와 NI 로 확인이 가능합니다. 와우~
운영체제는 가급적 CPU활용률을 높게 유지 할 수 있도록 우선순위를 할당합니다.
CPU가동 시간 중 작업을 처리하는 시간의 비율을 의미합니다. 활용을 유지하기 위해 기본적으로 입출력 작업이 많은 프로세스를 우선순위를 높게 측정합니다.
대부분의 프로세스들은 CPU와 입출력 장치를 모두 사용해 실행과 대기 상태를 오가며 만듭니다.
이때 프로세스가 CPU를 사용하는 작업을 CPU버스트 라고합니다.
입출력을 기다리는것은 입출력 버스트 라고합니다.
복잡한 수학연산이나 그래픽 처리 작업은 입출력 집중 프로세스라고 하고 후자를 CPU 집중 프로세스 라고도 합니다.

입출력 집중 프로세스를 가능한빨리 실행시켜서 끊임없이 입출력 장치를 작동시킨 다음 CPU집중 프로세스에 집중적으로 CPU를 할당하는것이 더 적합합니다!
CPU를 이용하고 싶거나 메모리에 적재되고 싶은 프로세스는 대기 상태로 특정 입출력 장치를 이용하고 싶은 프로세스 모두에 해당합니다. 이 줄은 스케줄링 큐를 통해 구현이 됩니다.
CPU를 이용하고싶은 프로세스의 PCB와 메모리로 적재되고싶은 PCB , 특정 입출력 장치를 이용하고싶은 프로세스의 PCB를 큐에 삽입하여 줄 세우는 것입니다.
준비큐는 CPU를 사용하고 싶은 프로세스의 PCB가 서는 줄을 의미하고
대기큐는 대기상태에 접어든 프로세스의 PCB가 서는 줄을 의미합니다.
입출력 작업을 수행중일 경우 대기큐에서 대기 상태로 입출력 완료 인터럽트를 기다리게 됩니다.
준비상태인 프로세스의 PCB는 준비 큐의 마지막! 에 삽입이 됩니다. 차례를 기다리게 되고, 운영체제는
큐에 삽입된 순서대로 실행하되 우선순위가 높은 프로세스부터 먼저 실행합니다.
실행되는 프로세스가 할당 받은 시간을 모두 소모할 경우 준비 큐로 다시 이동하고,
실행 도중 입출력 작업을 수행하는 등 대기 상태로 접어들어야 할 경우대기큐로이동하게됩니다.
스케줄링은 기본적으로 프로세스의 실행이 끝나면 이루어집니다. 하지만 종료되지 않아도 실행되는 경우가 있습니다.
1. 하나는 실행 상태에서 입출력 작업을 위해 대기 상태로 전환 될 때.
2. 실행 상태에서 타이머 인터럽트가 발생해 준비 상태로 변경이 될 때 입니다.
선점형 스케줄링은 운영체제가 프로세스로 부터 CPU자원을 뺏어 다른 프로세스에 할당하게 합니다.
비선점형 스케줄링은 다른 실행되고 있는 프로세스가 종료되기전까지 대기하고 끼어들 수 없습니다.
운영체제가 프로세스에 CPU를 배분하는 방법은 CPU스케줄링 알고리즘이라고 합니다. CPU알고리즘의 종류는 매우 다향합니다.
1. FCFS
2.SJF
3.RR
4.SRT
선입 선처리 스케줄링 이라고 불립니다. 단순하게 큐에 먼저 삽입 된 순서대로 먼저 CPU에 요청한 프로세스부터 CPU를 할당하는 방식입니다.
이렇기 때문에 때로 줄이 매~~우 길어질 수 있습니다. 이렇게 계속 기다리는 걸 호위 효과 라고 합니다.
최단 작업 우선 스케줄링이라고합니다. CPU의 이용시간이 가장 짧은 프로세스 먼저 시작합니다.
이것은 비선점형 알고리즘으로 구분이 되지만, '최소 잔여 시간 우선 스케줄링' 처럼 선점형으로 구현 될 때가 있습니다.
선입 선처리 스케줄링에 타임 슬라이스 라는 개념이 더해진 스케줄링 입니다.
타임 슬라이스란? 프로세스가 CPU를 사용하도록 정해진 시간을 의미합니다. 즉 라운드 로빈 스케줄링은 큐에 삽입된 프로세스들이 삽입된
순서대로 CPU를 이용하되, 정해진 타임 슬라이스 만큼만 CPU를 이용하는 선점형! 스케줄링입니다.
최단 작업 스케줄링과 라운드 로빈 스케줄링이 합친 스케줄링 방식입니다.
프로세스로 하여 정해진 타임슬라이스만큼 CPU를 이용하되, 남아있는 작업시간이 가장 적은 시간을 다음CPU로 선정합니다.
가장 높은 우선순위를 가진 프로세스 먼저 실행합니다.이것은 아주 단순해보이지만 근본적인 문제를 배포하고있습니다.
우선 순위가 높은 프로세스를 먼저 처리하기 때문에 낮은 프로세스는 실행이 지연됩니다. 이를 아사 현상이라고 합니다.
이를 방지하기 위한 방법은 에이징 이라는 것이 있습니다.
에이징? 오랫동안 대기한 프로세스를 점차 우선순위를 높이는 방식이다.
언젠가는 우선순위가 높아져 실행이 될것입니다.
우선순위 스케줄링의 발전 형태입니다. 여러개의 준비 큐를 사용하는 스케줄링 방식입니다. 프로세스를 먼저 처리하고 우선순위가
가장 높은 큐가 비어있게 되면, 다음으로 높은 큐의 프로세스를 처리합니다.

다단계 큐 스케줄링과 동작은 비슷하지만, 프로세스들 사이에 큐 사이를 이동 할 수 있습니다.
새롭게 진입하는 프로세스는 먼저 우선 순위가 가장 높은 우선순위 큐에 삽입되고, 타임 슬라이스 동안 실행됩니다.
만약 해당 큐에서 프로세스의 실행이 끝나지 않으면 다음 우선 순위 큐에 삽입되어 실행합니다.
결국 오래동안 CPU를 사용해야 하는 프로세스의 우선순위가 점차 낮아지게 되고, 비교적 CPU를 적게 사용해야하는 'CPU 집중 프로세스'들의 우선순위가
높은 큐에서 실행이 끝나게 됩니다. 또한 아사 현상을 예방하기 위해 큐로 이동시켜 에이징 기법을 적용 할 수도 있습니다!
따라서 비교적 CPU를 오래동안 사용하지 못한 프로세스의 우선순위는 자연스레 높아집니다.