프로세스 스케줄링
단일프로세서 시스템(Single Processor System)에서는 한 번에 한 프로세스만 실행될 수 있다. 하지만 프로세스가 항상 CPU를 사용하는 것은 아니다. 키보드나 마우스 등의 입력 장치에서 사용자의 입력을 기다리거나, 프린터 등의 느린 출력장치에서 데이터를 출력할 때 CPU는 일을 하지 않고 가만히 있는다.
일반적으로 프로세스는 CPU를 한차례 사용(CPU burst)하고 I/O를 한차례 사용(I/O burst)하는 주기를 반복한다. I/O를 사용하는 주기에서는 CPU를 사용하지 않는다. 그렇다면 여러 프로세스를 처리할 때, 한 프로세스가 모든 작업이 끝날때까지 기다렸다가 다음 프로세스를 실행하는 방법보다 한 프로세스를 실행 가능한 시점까지 실행하고, I/O 등 CPU를 사용하지 않는 작업을 할 때는 다른 프로세스를 실행한다면 CPU 사용 효율을 높일 수 있다.
오늘날의 운영체제는 위 아이디어를 프로세스 스케줄링(Process Scheduling)이라는 기술로 구현한다. 프로세스 스케줄링은 운영체제가 하는 가장 중요한 일 중 하나이다.
출처: 나무위키프로세스??
이번 글의 프로세스라는 의미는 그냥 하나의 "응용 프로그램"이다. 라고 생각하셔도 됩니다. 다만 일반적인 응용 프로그램이 아닌, "실행을 시킨 응용 프로그램 즉, 메모리에 올라와져있는 응용 프로그램"이다 라고만 생각하셔도 됩니다.
배치 처리라고도 말하며 마치 자료구조 큐(Queue | First In First Out)의 모습과 같습니다.
위의 그림처럼 여러 프로그램을 순차적으로 실행시킬 수 있는 방법으로 중간에 사용자의 개입 없이 전체 작업을 처리하는 방식을 말하는데 자동으로 다음 응용 프로그램이 이어서 바로 실행될 수 있도록 하는 시스템이라고 생각하면 됩니다.
초기에는 사용자와 상호작용하는 것이 불가능했지만 운영체제의 발전으로 프로그램 입/출력을 통해 상호작용하는 것이 가능해졌습니다.
Application 2
가 실행이 완료되기 위해서는 90분이 필요합니다.Application 2
가 실행이 완료되기 위해서는 30분이 필요합니다.만약 위의 두 프로그램의 실행 시간이 더 명확하게 차이난다면 Case 1에서처럼 실행 시간이 긴 프로그램이 먼저 등록이 된다면 그 뒤에 있는 프로그램들은 실행이 완료되기까지 많은 시간이 필요합니다. 또한 순차적인 진행으로 다중 프로그램을 지원할 수 없다는 단점도 존재합니다.
또한 위의 그림처럼 사용자는 Application 2
를 사용하기 위해 I/O 장치를 조작하더라도 Application 2
가 실제로 동작하기 까지 응답 시간을 많이 필요로 합니다.
그렇다고 사용하지 않는것은 아닙니다. 일괄 처리 시스템만의 장점도 존재하는데요
일괄 처리 시스템은 일정 기간마다 주기적으로 한꺼번에 처리할 필요가 있고 그룹별로 분류시킬 수 있는 성질을 가지고 있으며, 순차 접근방법을 사용할 수 있는 업무. 즉, 처리 요건이 일괄적인 업무에 대해 유사한 자료를 한데 모아 일정한 형식으로 분류한 뒤 한번에 일괄 처리함으로써 시간과 비용을 절감하여 업무의 효율성을 향상시킵니다.
출처: 위키백과
쉽게 말해 작업을 준비하는 시간을 낭비하지 않기 위해서 성질이 비슷한 작업들을 일괄적으로 모아서 처리하여 CPU의 효율도 높히고 시간과 비용 그리고 업무의 효율까지 향상시킨다는 의미입니다
시분할이라는 말의 뜻 그대로 실행할 프로그램을 여러개로 나뉘어 실행시키는 방법으로 다중 사용자 지원을 위해 컴퓨터 응답 시간을 최소화 하는 시스템입니다. 이러한 방법은 현재 사용중인 프로그램 자신만이 컴퓨터를 사용하는것처럼 느껴지지만 실제로는 하나의 컴퓨터가 여러 프로그램을 빠르게 전환하는 것입니다.
위의 그림을 보면 일괄 처리때와 같이 사용자가 Application 2
를 사용하기 위해 I/O 장치를 조작하여도 응답 시간이 크지 않다는걸 볼 수 있습니다.
물론 눈으로 이해하기 쉽게하기 위해 크게 나뉘어져 있고 응답 시간도 어느정도 있는것처럼 보이지만 실제로는 사람이 반응할 수 없을 만큼 적은 응답 시간이 필요하기 때문에 사용자가 여러개의 프로그램을 사용하기에 불편함이 없습니다.
시분할 시스템(時分割 System, 영어: time-sharing)은 컴퓨터를 대화식으로 사용하려는 시도에서 탄생하였다. 시분할 운영 체제는 CPU 스케줄링과 다중 프로그래밍을 이용해서 각 사용자들에게 컴퓨터 자원을 시간적으로 분할하여 사용할 수 있게 해 준다. 출력이 사용자에게 표시되고 입력을 키보드에서 읽어들이는 대화식 인터페이스를 제공할 수 있다. 대화식 입출력 속도는 보통 사람들의 처리속도와 같으므로 종료할 때까지 오랜 시간이 걸린다. 예를 들면, 입력은 타이핑 속도에 의해 제약을 받는데 사람에게는 1초에 5문자를 치는 것이 빠른 편이지만 컴퓨터 입장에서는 아주 느린 것이다. 이러한 경우 운영 체제는 CPU를 그냥 쉬게 하지 않고 다른 사용자의 프로그램을 수행하도록 전환시킨다. 출처: 위키백과
한 번에 2가지 이상의 일을 동시에 처리하는것을 우리는 멀티 태스킹이라고 부릅니다.
이러한 멀티 태스킹은 운영체제의 발전으로 현대의 컴퓨터 역시 할 수 있는데 기본적인 동작 원리는 A라는 프로그램을 실행하다 B라는 프로그램을 실행하고 다시 A라는 프로그램을 실행하고 이것을 매우 빠르게 반복적으로 하는것입니다.
물론 엄밀히 말하면 정확한 멀티 태스킹은 아닙니다. 단지 반복하는 동작이 매우 빨라 동시에 처리하는것처럼 보여질뿐이지만 사용자는 단일 CPU에서 여러 응용 프로그램이 동시에 실행되는것처럼 느껴집니다.
물론 현대의 CPU에는 다수의 코어가 들어가있는 경우가 대부분이기 때문에 당연히 여러가지 작업을 동시에 처리할 수 있지만 이번 주제는 단일 CPU라고 생각하신다면 이해가 쉬울듯 합니다.
멀티 프로세싱과 멀티 태스킹이 헷갈린다면 CPU를 생각하면 됩니다.
CPU의 풀 네임은 centralprocessing
unit입니다.
멀티 태스킹은 단일의 CPU에서 여러개의 프로그램을 실행시키기 위해 사용한다면 멀티 프로세싱은 다수의 CPU가 하나의 프로그램을 병렬로 실행해서 실행속도를 극대화한것이라 생각할 수 있습니다.
작업 스케줄링의 중요한 측면 중 하나는 다중 프로그래밍을 할 수 있는 능력이다. 왜냐하면 비다중 프로그래밍 시스템에서는 입출력을 기다리는 동안 CPU가 유휴 상태가 되어 비효율적이지만, 다중 프로그래밍 시스템에서는 주기억장치에 적재된 여러 개의 프로그램들을 CPU가 항상 수행하도록 하여 CPU 이용률을 증진시키기 때문이다.
운영체제는 기억장치에 있는 작업들 중에서 하나를 택해서 실행하기 시작한다. 이 작업에는 키보드로 입력하게 될 명령, 입출력 조작이 끝나는 것과 같은 어떤 일을 기다려야 할 필요가 있는데, 이러한 경우 비다중 프로그래밍 시스템에서는 CPU가 유휴 상태로 놓이지만 다중 프로그래밍 시스템에서는 운영체제가 다른 작업으로 전환하여 그것을 수행하도록 한다.
또 그 작업이 어떤 것을 기다려야 된다면 CPU는 또 다른 작업으로 전환된다. 이와 같은 과정이 반복되다 보면 결국 첫 번째 작업은 기다리는 것이 끝나 CPU를 다시 차지하게 된다. 따라서 수행해야 할 작업이 있는 한 CPU는 유휴 상태가 되지 않는다. | 출처: 위키백과
쉽게 말해 CPU를 최대한 많이 활용하도록 하는 시스템으로 시간 대비 CPU의 활용도를 높이기 위한 방법입니다.
위의 위키백과에도 나와있지만 예를 들어 설명하자면 CPU가 코드를 읽는 와중에 보조기억장치등의 파일을 가져와야 할 일이 생긴다면, CPU는 자신보다 현저히 속도가 느린 보조기억장치를 기다려야하는 일이 생깁니다. 즉, 유후 상태가 된다는 말인데 이러한 경우에는 CPU를 사용하지도 못하고 그만큼 프로그램의 실행 시간이 늘어나기 때문에 효율적이지 못하다는 의미입니다. 아래 코드를 보면 이해가 쉽습니다.
#include <unistd.h> // CPU에서 Library include
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
int fd;
fd = open("data.txt".O_RDONLY);
// fd 변수에 open() => 파일을 열어달라는 시스템 콜 호출하여 값을 넣는다.
if(fd == -1) {
printf("Error: can not open fileWn");
return 1;
} else {
printf("File opened and now close_Wn");
close(td);
return ();
}
}
위의 코드에서 CPU는 순서대로 코드를 읽어나가다가 fd = open();
을 만나면 보조기억장치에서 파일을 가져와야합니다. 위에 설명한대로 보조기억장치의 속도는 CPU의 속도에 비해 너무나 느리기 때문에 바로 아래에 있는 조건문if()
을 만가기까지 시간이 오래걸립니다. 때문에 그 시간동안 CPU에게 다른 응용 프로그램을 실행시킬 수 있도록 바꿔주면 효율을 더 높힐 수 있다는 말입니다.
위의 코드를 그림으로 살펴보면 이해가 더 쉽습니다. 두 경우 모두 10개의 칸(CPU의 활용 시간)을 가지고 있고 한 칸당 1초라고 가정해보겠습니다.
뿐만 아니라 Application 2의 경우만 봐도 CPU가 쉬지않고 일을 해준 덕분에 앞의 경우보다 먼저 프로그램을 실행할 수 있게됩니다.
| 출처: computationstructures.org
해당 블로그에 C/S 하드웨어편에서도 이야기했지만 위 그림의 Access time을 살펴보면 대략적으로 어느정도 차이가 나는지 알 수 있습니다. CPU안에 있는 레지스터와 케시는 큰 차이가 없지만 주기억장치인 메모리와 보조기억장치인 하드디스크는 매우 많이 차이가 난다는걸 볼 수 있습니다.
이번 글에서 나온 시분할 시스템, 멀티 프로그래밍, 멀티 태스킹은 유사한 의미로 사용이 된다고 생각하면 됩니다. 핵심은 사용자가 여러 응용 프로그램을 동시에 실행할 수 (있는것 처럼)있으며, CPU를 쉬지 않고 계속 사용해서 응용 프로그램의 실행을 빠른 시간안에 완료시킬 수 있고 응답 시간 또한 짧게 만들어 다중 사용자도 지원할 수 있게 하는것 입니다.