[운영체제][CPU 스케쥴링] 멀티 태스킹, 멀티 프로세싱, 멀티 프로그래밍

최지수·2022년 1월 24일
2

운영체제

목록 보기
4/13
post-thumbnail

CPU 스케쥴링

컴퓨터가 실행되면 다양한 프로세스들이 동작해요. 우리가 보기에는 이 다수의 프로세스가 한꺼번에 동작이 되는 것처럼 보이죠. 지금 제가 키보드로 기술 블로그를 작성함과 동시에 유튜브에서 뉴스를 보고 있는 것처럼요. 컴퓨터는 여러가지 일을 동시에 처리해주는게 아니라 효율적으로 프로세스에게 자원을 분배시켜서 다수의 업무를 효율적으로 처리할 수 있게 지원하는 겁니다. 이번 내용은 효율적으로 CPU 자원을 분배하는 스케쥴링 방식에 대해 알아 볼거에요.

배치 처리 시스템

자동으로 다음 응용 프로그램이 이어서 실행될 수 있도록 하는 시스템이에요. 즉, 여러 프로그램을 순차적으로 실행시킬 수 있게 해주죠. 현재 이 시스템은 안씁니다. 그 이유는,

배치 처리 시스템 문제점
1. 어떤 프로그램은 실행 시간이 너무 걸려 다른 프로그램이 실행하는데 대기 시간이 크다.
2. MP3 음악을 들으며 문서 작성은 해당 시스템에선 불가능해요. \to 동시에 여러 프로세스 실행
3. 여러 사용자가 동시에 하나의 컴퓨터를 사용하는 다중 사용자 지원이 어려워요.

그래서 이를 개선하는 아래와 같은 시스템을 활용해요.

시분할 시스템

이는 다중 사용자 지원을 위해 컴퓨터 응답 시간을 최소화하는 시스템이에요. 응용 프로그램이 CPU를 점유하는 시간을 잘게 쪼개서 실행할 수 있도록 하는 시스템이에요.

멀티 태스킹

단일 CPU에서 여러 응응 프로그램이 동시에 실행되는것처럼 보이도록 하는 시스템이에요. 이 시스템이 구성되야만 지금 제가 하고 있는, 유튜브를 틀면서 기술 블로그를 작성할 수 있게 되요.

실제 멀티 태스킹(Linux 기준)

Linux 상에선 10~20 ms 단위로 실행 응용 프로그램이 바뀝니다. 아주 짧은 텀으로 컴퓨터가 CPU를 통해 작업한다고 생각하시면 됩니다.

멀티 프로세싱(feat. 멀티 태스킹이랑 혼용)

일반적으로 두 명칭은 혼용된다고 해요. 그래서 시분할, 멀티 태스킹만 알아도 충분하다고 합니다. 하지만 차이를 본다면 아래와 같아요.

멀티 태스킹 vs. 멀티 프로세싱

  • 둘 다 시분할 시스템 방식으로 CPU 자원을 짧은 텀으로 받아 수행하는 방식이에요.
  • 멀티 태스킹은 단일 CPU 단위로 이루어져요.
  • 멀티 프로세싱은 다중 CPU에 하나의 프로그램을 병렬로 실행해서 실행 속도를 극대화시킨다는 차이가 있어요. 물론 CPU마다 여러 프로세스를 수행하게 하는 것은 덤이죠.

멀티 프로그래밍

최대한 많은 CPU를 활동하도록 하는 시스템이에요. 이 시스템의 목적은,

멀티 프로그래밍 목적
1. 시간 대비 CPU 활용도를 높여요.
2. 응용 프로그램을 짧은 시간 안에 실행 완료시키자!

응용 프로그램은 온전히 CPU를 쓰기 보단, 다른 작업을 중간에 필요로 하는 경우가 많아요. 시스템콜 중 하나인 파일 입출력이 대표적인 예죠. 응용 프로그램이 실행 중에 파일을 읽게 되면 이는 저장매체에 접근을 하기 때문에 느리죠.

메모리 계층(feat. 각 메모리 접근당 수행 사이클 시간)

저장매체에 접근을 하면 왜 느리냐를 참고하기 위해 올려봤어요. 기본적으로 하드웨어 접근은 저어어어 아래에 위치하고 가장 느려요. 심지어 Flash DriveSSD도 느려요.

그래서 파일 읽기 같은 커널 모드로 들어가서 접근하는 걸 다른 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 스케쥴링에 대한 내용은 여기까지에요. 꽤나 많이 썼네요. 짧게 정리해볼게요!

  • 시분할 시스템, 멀티 태스킹, 멀티 프로그래밍은 유사한(똑같은X) 의미로 통용
    • 시분할 시스템 : 다중 사용자 지원, 컴퓨터 응답시간을 최소화하는 시스템
    • 멀티 태스킹 : 단일 CPU에서 여러 응용 프로그램을 동시에 실행하는 것처럼 보이게하는 시스템
    • 멀티 프로세싱 : 여러 CPU에서 하나의 응용 프로그램을 병렬로 실행해서 속도를 높이는 기법
    • 멀티 프로그래밍 : 최대한 CPU를 일정 시간당 많이 활용하는 시스템
  • 여러 응용 프로그램을 실행 가능하게 함
  • 응용 프로그램이 동시에 실행되는 것처럼 보이도록 함
  • CPU를 쉬지 않고 응용 프로그램을 실행하도록 해서, 짧은 시간에 응용 프로그램이 실행 완료될 수 있도록 함
  • 컴퓨터 응답 시간도 짧게 해서 다중 사용자도 지원
profile
#행복 #도전 #지속성

0개의 댓글