컴퓨터가 실행되면 다양한 프로세스들이 동작해요. 우리가 보기에는 이 다수의 프로세스가 한꺼번에 동작이 되는 것처럼 보이죠. 지금 제가 키보드로 기술 블로그를 작성함과 동시에 유튜브에서 뉴스를 보고 있는 것처럼요. 컴퓨터는 여러가지 일을 동시에 처리해주는게 아니라 효율적으로 프로세스에게 자원을 분배시켜서 다수의 업무를 효율적으로 처리할 수 있게 지원하는 겁니다. 이번 내용은 효율적으로 CPU 자원을 분배하는 스케쥴링 방식에 대해 알아 볼거에요.
자동으로 다음 응용 프로그램이 이어서 실행될 수 있도록 하는 시스템이에요. 즉, 여러 프로그램을 순차적으로 실행시킬 수 있게 해주죠. 현재 이 시스템은 안씁니다. 그 이유는,
배치 처리 시스템 문제점
1. 어떤 프로그램은 실행 시간이 너무 걸려 다른 프로그램이 실행하는데 대기 시간이 크다.
2. MP3 음악을 들으며 문서 작성은 해당 시스템에선 불가능해요. 동시에 여러 프로세스 실행
3. 여러 사용자가 동시에 하나의 컴퓨터를 사용하는 다중 사용자 지원이 어려워요.
그래서 이를 개선하는 아래와 같은 시스템을 활용해요.
이는 다중 사용자 지원을 위해 컴퓨터 응답 시간을 최소화하는 시스템이에요. 응용 프로그램이 CPU를 점유하는 시간을 잘게 쪼개서 실행할 수 있도록 하는 시스템이에요.
단일 CPU에서 여러 응응 프로그램이 동시에 실행되는것처럼 보이도록 하는 시스템이에요. 이 시스템이 구성되야만 지금 제가 하고 있는, 유튜브를 틀면서 기술 블로그를 작성할 수 있게 되요.
Linux
상에선 10~20 ms 단위로 실행 응용 프로그램이 바뀝니다. 아주 짧은 텀으로 컴퓨터가 CPU를 통해 작업한다고 생각하시면 됩니다.
일반적으로 두 명칭은 혼용된다고 해요. 그래서 시분할, 멀티 태스킹만 알아도 충분하다고 합니다. 하지만 차이를 본다면 아래와 같아요.
멀티 태스킹 vs. 멀티 프로세싱
- 둘 다 시분할 시스템 방식으로 CPU 자원을 짧은 텀으로 받아 수행하는 방식이에요.
- 멀티 태스킹은 단일 CPU 단위로 이루어져요.
- 멀티 프로세싱은 다중 CPU에 하나의 프로그램을 병렬로 실행해서 실행 속도를 극대화시킨다는 차이가 있어요. 물론 CPU마다 여러 프로세스를 수행하게 하는 것은 덤이죠.
최대한 많은 CPU를 활동하도록 하는 시스템이에요. 이 시스템의 목적은,
멀티 프로그래밍 목적
1. 시간 대비 CPU 활용도를 높여요.
2. 응용 프로그램을 짧은 시간 안에 실행 완료시키자!
응용 프로그램은 온전히 CPU를 쓰기 보단, 다른 작업을 중간에 필요로 하는 경우가 많아요. 시스템콜
중 하나인 파일 입출력이 대표적인 예죠. 응용 프로그램이 실행 중에 파일을 읽게 되면 이는 저장매체에 접근을 하기 때문에 느리죠.
저장매체에 접근을 하면 왜 느리냐를 참고하기 위해 올려봤어요. 기본적으로 하드웨어 접근은 저어어어 아래에 위치하고 가장 느려요. 심지어 Flash Drive
인 SSD
도 느려요.
그래서 파일 읽기 같은 커널 모드로 들어가서 접근하는 걸 다른 CPU에서 실행시키고 그 동안 기존 CPU에선 다른 응용 프로그램을 수행하는 것이 효과적여요.
// 1. CPU - START
#include <unistd.h>
...
int main(){
int fd;
// 1. CPU - END
// 2. Kernel - START
// (저장매체 접근 -> 오픈 -> 결과 값)
// 'Blocking' 상태
// open()은 다른 CPU에서 사용되고, 해당 CPU에선
// 그 동안 다른 프로세스를 사용하여 CPU 활용도를 높일 수 있음
// ex.
// app1 - blocking * (n - 1) - app1 - app3 * n -> 활용도 낮음
// app1 - blocking * app3 * (n - 1) - app 1 app3 -> 활용도 높음
fd = open("data.txt", O_READ_ONLY);
// 'Blocking' 해제
// 2. Kernel - END
if(fd == -1){
printf("Error : Cannot open file\n");
return 1;
} else{
printf("File opened no close\n");
close(fd);
}
return 0;
}
open()
은 대표적인 커널 모드에서 실행되는 함수죠. 복기 겸 정리하자면, 이렇게 저장매체에 접근하게 되면 해당 코드의 프로세스를 blocking
상태로 둬서 잠깐 멈춰놔요. 이 일이 마칠 때까지 CPU가 놀고 있으면 아쉬우니까 그 동안 다른 프로세스를 사용하고, 저장매체에서 읽어 오는 것을 완료하고, CPU를 쓸 수 있는 상태다!라고 하면 blocking
상태를 해제하고 다시 수행하는 방식인거죠.
CPU 스케쥴링에 대한 내용은 여기까지에요. 꽤나 많이 썼네요. 짧게 정리해볼게요!