CPU[schedule]
CPU 스케쥴링
모든 프로세스는 CPU를 필요로 하고, 모든 프로세스는 먼저 CPU를 사용하고 싶어 합니다.
하지만 컴퓨터의 CPU는 무한한 자원이 아닌, 한정적인 자원으로 모든 프로세스에게 할당하기란 사실상 어려운 일입니다.
그래서 운영체제는 공정하고 합리적으로 프로세스에게 CPU 자원을 배분시켜주는데, 이거를 바로 CPU 스케쥴링이라고 합니다.
CPU 스케쥴링은 공정하고 합리적으로 CPU를 배분시키지 못하면 이는 컴퓨터의 성능과 직결되는 대단히 중요한 문제입니다.
우선순위
각각의 프로세스에는 우선순위가 존재합니다.
여기서 우선순위란 운영체제가 프로세스에게 CPU를 먼저 할당해야 할 순서 같은 개념입니다.
참고로 일반적인 프로세스보다는 입/출력 작업이 많은 프로세스가 우선순위가 높습니다.
대부분의 프로세스는 CPU와 입/출력 장치를 모두 사용하며 실행됩니다.
예를 들어서 워드 프로세서를 생각해보겠습니다.
- CPU를 사용하여 명령어를 실행합니다.
- 사용자로부터 입력 받는 내용을 보조기억장치(SSD, 하드 디스크 등)에 저장합니다.
- CPU를 사용하여 명령어를 실행합니다.
- 사용자가 입력한 내용을 화면에 출력합니다.
이런 과정을 반복하여 실행됩니다.
즉, 대부분의 프로세스는 CPU와 입/출력 장치를 번갈아 가며 실행됩니다.
입/출력 작업이 많은 프로세스를 입출력 집중 프로세스라 하고, CPU작업이 많은 프로세스를 CPU 집중 프로세스라고 합니다.
그런데 프로세스 종류마다 CPU, 입/출력 장치를 이용하는 시간의 양에 차이가 있습니다.
입/출력 집중 프로세스는 실행 상태보다 대기 상태에 더 많이 머무르고, 반대로 CPU 집중 프로세스는 대기 상태보다 실행 상태에 더 많이 머무릅니다.
입/출력 집중 프로세스는 대기 상태에 더 많이 머무르기 때문에 CPU 집중 프로세스와 입/출력 집중 프로세스가 동시에 요청이 들어오면, 입/출력 집중 프로세스를 가능한 한 빨리 실행시켜 입/출력 장치를 계속 작동 시키고, 그런 다음에 CPU 집중 프로세스에 CPU를 할당하는 것이 효율적 입니다.
이렇듯 각각의 상황에 맞게 CPU를 배분하는것이 더 효율적 입니다.
이처럼 프로세스는 상황에 맞게, 프로세스의 중요도에 맞게 CPU를 이용하기 위해 우선순위를 가지고 있습니다.
운영체제는 각 프로세스의 PCB에 우선순위를 명시하고, PCB에 적힌 우선순위를 기준으로 먼저 처리할 프로세스를 정합니다.
스케쥴링 큐
스케쥴링 큐는 CPU가 사용할 다음 프로세스를 찾기 위해 모든 프로세스의 PCB를 찾아보는 단점을 해결하기 위한 자료구조입니다.
스케쥴링 큐는 운영체제가 메모리로 새로 생성되는 프로세스, CPU를 이용하고 싶은 프로세스, 특정 입/출력 장치를 이용하고 싶은 프로세스들을 큐에 삽입합니다.
대표적인 큐로는 대기큐, 준비큐가 있습니다.
- 대기 큐 : 입/출력 장치를 이용하기 위해 대기 상태로 접어든 프로세스들이 서는 줄을 의미합니다.
- 준비 큐 - CPU를 이용하고 싶은 프로세스들이 서는 줄을 의미합니다.
준비 상태에 있는 프로세스들의 PCB는 준비 큐의 마지막에 삽입되어 CPU의 사용 차례를 기다립니다.
운영체제는 순서대로 프로세스를 하나씩 꺼내어 사용하지만, 우선순위가 높은 프로세스를 먼저 실행합니다.
대기 상태에 있는 프로세스 또한 마찬가지입니다.
특정 입/출력 장치 사용을 요구한 프로세스는 특정 입/출력 장치 대기 큐에서 입/출력 작업이 완료되기를 기다립니다.
입/출력 작업이 완료되었다는 인터럽트가 발생하면 운영체제는 대기 큐에서 해당 작업이 완료된 PCB를 찾고, 준비 상태로 변경한 뒤 대기 큐에서 제거합니다.
제거된 PCB는 준비 큐로 이동합니다.
선점형 스케쥴링
선점형 스케쥴링은 프로세스가 CPU를 비롯한 자원을 사용하고 있더라고 운영체제가 이 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케쥴링 방식을 의미합니다.
이런 방식은 어느 하나의 프로세스가 자원을 독점하여 사용할 수 없어서 자원 독점을 막고 프로세스들에게 자원을 골고루 배분할 수 있다는 장점이 있지만, 그만큼 문맥교환 과정에서 오버헤드가 발생할 수 있습니다.
비선점형 스케쥴링
비선점형 스케쥴링은 하나의 프로세스가 자원을 사용하고 있다면 이 프로세스가 종료되거나, 스스로 대기 상태에 접어들 때까지 다른 프로세스가 끼어들 수 없는 스케쥴링 방식을 의미합니다.
비선점형 스케쥴링은 문맥 교환의 횟수가 선점형 스케쥴링 보다는 적어서 오버헤드가 발생할 확률이 적지만, 하나의 프로세스가 자원을 사용중이면, 다른 프로세스는 무작정 기다려야 해서 자원을 골고루 배분할 수 없다는 단점이 존재합니다.