Aesthetic Algorithm
[혼공학습단] Week 4: 운영체제, 프로세스와 스레드, CPU스케줄링 본문
🟨 이번 주 범위 🟨
Chapter 09. 운영체제 시작하기
09-1 운영체제를 알아야 하는 이유
09-2 운영체제의 큰그림
Chapter 10. 프로세스와 스레드
10-1 프로세스 개요
10-2 프로세스 상태와 계층 구조
10-3 스레드
Chapter 11. CPU 스케줄링
11-1 CPU 스케줄링 개요
11-2 CPU 스케줄링 알고리즘
Chapter 09. 운영체제 시작하기
이번 주부터는 컴퓨터 구조에 대한 학습을 바탕으로 운영체제에 들어간다.말로만 듣던 윈도우, 맥, 리눅스... 에 대해 기술적으로 자세히 살펴보는 시간이 되길 바란다.
09-1. 운영체제를 알아야 하는 이유
✔️운영체제가 뭐고, 왜 알아야 할까?
우리가 늘상 사용하는 노트북, 휴대폰 등에는 모두 운영체제가 설치되어 있다.
내 LG그램 노트북에는 윈도우가, 아이폰에는 iOS 운영체제가 있다.
운영체제라는 특별한 프로그램에 대해 알아보자.
운영체제
모든 프로그램을 실행할 때에는 시스템 자원이 필요하다.
예를 들어 내가 휴대폰 갤러리에 있는 사진들을 백업하고 싶다면, 외장 하드디스크라는 하드웨어가 필요하고, 그것을 자원이라 부른다.
실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 바로 운영체제다.
이전 장들에서 보았듯 프로그램은 메모리에 적재되어 실행되는데, 이 운영체제는 워낙 특별하다보니 특별취급을 해 주어야 한다. 따라서 메모리 내 커널 영역이라는 공간에 따로 적재되어 실행된다.
표에 있는 Applications는 인터넷 브라우저나 메모장 같은 응용 프로그램을 의미한다.
이러한 프로그램들을 메모리에 적재한 주체가 바로 운영체제다.
내가 지금 작성 중인 끄면, 운영체제는 메모리에서 인터넷 브라우저를 제거할 것이다.
이런 식으로 운영체제는 메모리 자원을 효율적으로 관리하게 된다.
응용 프로그램들이 실행되기 위해서는 CPU가 필수적인데, 알다시피 CPU자원은 무제한이 아니다.
따라서 공정하게 여러 프로그램에 CPU자원을 할당하는 역할을 운영체제가 하게 된다.
요약하면 운영체제는 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 것이다.
1) User: 내가 유튜브 ASMR영상을 틀어놓기 위해 작업 표시줄에 있는 chrome 아이콘을 눌렀다.
2) Application: chrome이 실행되면서, 유튜브 웹사이트에 접속하고, ASMR영상을 재생한다.
3) Operating system: chrome이 실행되도록 CPU시간과 메모리 공간을 할당한다. 또한 사용자가 클릭하거나 키보드로 입력할 때마다 입출력장치와 연결되도록 조율한다.
4) Hardware: 영상 데이터를 CPU가 처리하고, 메모리에 임시 저장한 뒤, GPU와 모니터를 통해 영상이 모니터로 출력된다.
내가 ASMR영상 창을 닫는 순간에는 운영체제가 메모리에서 chrome 관련 데이터를 정리하고 CPU, 메모리 자원을 다른 프로그램이 사용할 수 있도록 돌려주겠지.
그렇다면 알아서 잘 돌아가고 있는 운영체제를 내가 왜 알아야 할까?
내가 열심히 짠 코드들은 결국 하드웨어에서 실행되는데, 그 하드웨어를 조작하는 프로그램이 운영체제이기 때문이다.
따라서 앞으로 내가 무수히 맞닥뜨릴 문제들을 해결하기 위해서는 운영체제가 내게 건네는 말을 잘 이해하고 해석할 줄 알아야 한다. 그 과정을 잘 해낸다면, 내 코드의 오류 메시지는 더 이상 외계어가 아닐 것이다.
09-2. 운영체제의 큰 그림
✔️커널이 뭘까?
✔️운영체제는 응용 프로그램에 무엇을 제공할까?
리눅스를 구성하는 코드는 천만 줄이 넘는다고 한다.. 저번 주에 이어 개발자들에게 RESPECT.
운영체제는 아주 다양하게 존재한다. 그리고 운영체제가 제공하는 서비스 또한 다양하다.
운영체제의 핵심 서비스 담당은 커널(kernel)이라고 한다.
자원에 접근하고 조작하는 기능, 프로그램이 올바르게 실행되게 하는 역할 등을 수행한다.
운영체제의 서비스 중 커널이 아닌 것은 유저 인터페이스가 있다. 외부와 맞닿아 직접적으로 상호작용하는 역햘을 하니, 어찌보면 사람의 얼굴에 해당할 수 있겠다. (커널은 심장, 안 보이는 곳에서 핵심 기능을 담당하는..)
몰랐는데, UI에는 2가지 종류가 있다고 한다. 그동안 난 스마트폰의 스크린에 보이는 그 UI만 있는 줄 알았다.
종류 | 설명 |
그래픽 유저 인터페이스 | 그래픽 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스 ex) 윈도우 바탕하면 |
커맨드 라인 인터페이스 | 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스 ex) 명령 프롬프트 |
운영체제는 응용 프로그램들이 직접 하드웨어 자원에 접근하는 대신 자기를 통해서만 접근을 허용하게 한다.
이러한 문지기 역할은 이중 모드로써 구현된다.
이중 모드
CPU가 명령어를 실행하는 모드를 사용자 모드와 커널 모드로 구분하는 방식이다.
응용 프로그램은 사용자 모드에서 실행되어 제한된 권한만 부여하고, 정말 중요한 하드웨어 제어는 커널 모드에서만 가능하도록 하였다. 비유하자면, 손님이 식당에 들어가서 메뉴판(응용 프로그램)에서 메뉴를 고를 수는 있지만, 직접 주방에서 요리를 할 수는 없고 웨이터(운영체제)에게 부탁하는 것과 같다.
웨이터가 받은 주문을 주방장이 받아서 직접 재료(하드웨어)를 다루고, 요리를 만들어 손님에게 가져다준다.
주방장의 권한은 식당의 존폐가 달려있기 때문에, 최고 권한을 가진다고 볼 수 있다.
그렇다면 예시를 들어 보자.
사용자 모드에서 내가 워드로 쓴 레포트 파일을 저장한다고 할 때, 파일 저장 요청을 하게 된다.
워드 파일은 직접 디스크에 접근할 권한이 없기 때문에, 시스템 콜을 통해 OS에 파일 저장을 요청한다.
운영체제가 커널 모드로 전환되어 디스크 드라이버를 제어해 파일을 저장하게 된다. 작업이 종료되면, 사용자 모드로 돌아와 워드에 저장 완료가 되었다고 알려주는 것이다.
구분 | 사용자 모드 | 커널 모드 |
정의 | 일반 응용 프로그램이 실행되는 제한된 모드 | 운영체제 핵심 기능이 실행되는 특권 모드 |
권한 수준 | 제한적 (하드웨어 접근 불가) | 최고 수준 (모든 자원 접근 가능) |
직접 접근 가능 자원 | 메모리의 일부만 접근 가능 | 모든 하드웨어 및 메모리 접근 가능 |
실행 대상 | 응용 프로그램, 유저 코드 | 운영체제 커널, 드라이버 |
시스템 자원 접근 | 시스템 콜을 통해서만 가능 | 직접 접근 및 제어 가능 |
예시 | 크롬, 메모장, 게임 등 일반 앱 | 메모리 관리자, 파일 시스템, 장치 드라이버 |
보안 측면 | 안전 (운영체제 보호됨) | 위험 (오류 시 시스템 전체 영향을 줌) |
시스템 호출
사용자 모드로 실행되는 프로그램이 자원에 접근하는 OS 서비스를 제공받으려면 OS에 요청을 보내 커널 모드로 전환되어야 한다. 이 요청을 시스템 호출(system call)이라 한다. 일종의 소프트웨어적 인터럽트로 볼 수 있다.
프로세스 관리
✅프로세스: 실행 중인 프로그램
우리가 컴퓨터를 사용하는 동안 메모리 내에서는 새로운 프로세스들이 계속 생성되고, 안 쓰는 건 삭제되고 있다.
하나의 CPU에서는 한 번에 하나의 프로세스만 실행할 수 있기 때문에 이 프로세스들은 번갈아 가며 실행된다.
그런데, 각 프로세스는 너무나 다양하기 때문에 각각의 상태와 사용하고자 하는 자원이 다르다. 따라서 OS는 이 프로세스들을 잘 관리할 필요가 있다.
자원 접근 및 할당
운영체제는 CPU, 메모리, 입출력장치 등을 어떤 식으로 관리할까?
1) CPUOS는 프로세스들에게 공정하게 CPU를 할당하기 위해 CPU 스케줄링을 수행한다.2) 메모리메모리에 적재된 프로세스들은 크기와 주소가 다양하다. 따라서 OS는 새로운 프로세스가 적재될 때마다 어느 주소에 적재할지 결정해야 하는데, 메모리 공간이 마땅치 않아 적재하지 못하는 등의 문제가 발생할 수 있다. (14장에서 극복 방법 배움)3) 입출력장치인터럽트 서비스 루틴을 통해 입출력 작업을 수행한다.
파일 시스템 관리
우리 컴퓨터에는 수많은 파일들이 있고, 그것들을 카테고리별로 묶어 폴더로 관리한다.
이러한 파일 시스템도 OS가 지원하는 서비스 중 하나이다.
Chapter 10. 프로세스와 스레드
10-1. 프로세스 개요
✔️ 프로세스가 뭘까?
✔️ 프로세스가 실행되는 과정은?
프로세스를 직접 확인해볼 수 있다.
개인적으로 컴퓨터 성능이 안좋아지는 것 같을 때 매번 이걸 열어서 작업 끝내기 버튼을 누르곤 한다.
단축키는 윈도우 기준 ctrl+shift+esc다.
별로 볼 건 없지만 현재 나의 프로세스다:
✅ 포그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스
ex) PyCharm, Google Chrome, 작업 관리자, 카카오톡
✅ 백그라운드 프로세스: 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
ex) ASDF Service Application, Antimalware Service(윈도우 보안 관련), 서비스 호스트, 다시 시작 등
프로세스 제어 블록
한정된 CPU자원으로 인해 프로세스들은 차례로 돌아가며 CPU를 이용하게 된다.
OS는 프로세스의 실행 순서를 관리하고 CPU자원을 배분하는데, 이를 위한 것이 프로세스 제어 블록(PCB)이다.PCB는 프로세스 관련 정보를 저장하는 자료 구조로 볼 수 있는데, 해당 프로세스를 식별하기 위한 태그라고 이해하면 된다.
PCB는 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.
✅ 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유번호
✅ 레지스터 값: 프로세스가 연산 중 사용하던 CPU 레지스터들의 값으로, 문맥 교환시 이전 프로세스의 상태를 저장하고 다음 프로세스를 이어 실행하기 위해 필요함.
✅ 프로세스 상태: 현재 프로세스의 상태를 나타나기 위함.
EX) Ready, Running, Waiting 등
✅ CPU 스케줄링 정보: 우선순위나 CPU사용량 등의 정보로, OS가 이 데이터를 바탕으로 어떤 프로세스를 먼저 실행할지 결정함.
✅ 메모리 관리 정보: 각 프로세스가 사용하는 메모리의 시작 주소, 크기, 페이지 테이블 등의 정보로, OS가 메모리 공간을 잘 관리하고 보호하는 데 사용된다.
✅ 사용한 파일과 입출력장치 목록: 프로세스가 실행 과정 중 열어둔 파일, 사용 중인 프린터 등 자원 목록이 기록된다.
단순화한 C 구조체 예시를 살펴보자.
struct PCB {
int pid; // 프로세스 ID
int state; // 상태 (0: ready, 1: running, ...)
int priority; // 우선순위
unsigned int pc; // 프로그램 카운터 주소
int registers[8]; // 일반 레지스터 값들
};
문맥 교환
프로세스 A가 실행 중이다가 프로세스 B로 넘어가면 어떻게 될까?
바로 직전까지 실행되던 A는 프로그램 카운터, 레지스터 값, 메모리 정보 등의 중간 정보를 백업해야 추후 실행을 재개할 수 있을 것이다. 이러한 중간 정보를 문맥이라고 하며 이는 PCB에 저장된다.
기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다.
프로세스의 메모리 영역
하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다:
구분 | 코드 영역(텍스트 영역) | 데이터 영역 | 힙 영역 | 스택 영역 |
저장 내용 | 프로그램의 실행 코드 (명령어) | 전역 변수, 정적 변수 | 동적 할당 메모리 | 함수 호출 정보, 지역 변수 |
할당 시점 | 컴파일 시 | 컴파일 시 | 실행 중 동적 할당 시 | 함수 호출 시 |
메모리 방향 | 고정된 위치 (변화 없음) | 고정된 위치 (변화 없음) | 아래에서 위로 증가 | 위에서 아래로 감소 |
주요 특징 | 읽기 전용 (보통 수정 불가) | 프로그램 종료 시까지 유지 | malloc, new 등으로 동적 할당 | 함수 호출 시 생성, 반환 시 해제 |
관리 주체 | 운영체제/컴파일러 | 운영체제/컴파일러 | 개발자 직접 관리 (해제 필요) | 컴파일러가 자동 관리 |
에러 예시 | 코드 수정 시 오류 (Segmentation fault) | 전역 변수 | 메모리 누수 (Memory Leak) | 스택 오버플로우 (Stack Overflow) |
예시 | main(), printf() 코드 자체 | int globalVar = 10; | int* arr = malloc(100); | int x = 3; (함수 내 지역 변수) |
코드 영역과 데이터 영역은 크기가 고정된 영역으로, 정적 할당 영역이라고 부른다.
반면 힙 영역과 스택 영역은 프로세스 실행 중 크기가 변할 수 있는 동적 할당 영역이라고 부른다.
10-2. 프로세스 상태와 계층 구조
✔️ 프로세스 상태가 뭘까?
✔️ 프로세스 계층 구조는?
노트북으로 열심히 작업을 하던 도중 응답하지 않습니다- 알림창이 뜬 기억은 누구나 있을 것이다.
실행 중이던 프로세스 상태가 응답 없음이 된 것인데, 이처럼 프로세스는 저마다 상태가 존재한다.프로세스 상태라는 것을 더 알아보자:
종류 | 설명 |
생성 상태 | 프로세스를 생성 중인 상태 이제 막 메모리에 적재되어 PCB를 할당받은 상태 |
준비 상태 | CPU를 할당받기 전 기다리고 있는 상태 |
실행 상태 | CPU를 할당받아 실행 중이다. 일정 시간만 CPU를 사용할 수 있다. |
대기 상태 | 입출력장치의 작업을 기다리는 상태 |
종료 상태 | 프로세스가 종료된 상태로, OS는 이때 PCB와 프로세스가 사용한 메모리를 정리하게 된다. |
프로세스 계층 구조
실행 중인 프로세스는 시스템 콜을 통해 다른 프로세스를 생성할 수도 있다.
✅ 부모 프로세스: 새 프로세스를 생성한 프로세스
✅ 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
이 두가지 프로세스는 서로 다른 프로세스기에 서로 다른 PID를 갖는다.
OS에서는 프로세스가 프로세스를 낳는 계층적 구조로 프로세스를 관리하게 되며 이를 프로세스 계층 구조라고 한다:
대충 보자면, init은 시스템에서 가장 먼저 실행되는 최상위 프로세스, kthreadd는 커널 스레드 관리자, sshd는 SSH 서버 데몬, bash는 사용자 로그인을 처리하는 기본 셸이라고 한다.
파이썬에서 배우긴 했으나 객체지향 프로그래밍과 상당히 유사한 구조를 보이는 것 같다.
프로세스 생성 기법
✅ folk: 부모 프로세스가 자신의 복사본을 자식 프로세스로 생성함, 이를 통해 부모 프로세스의 자원이 자식으로 상속된다.
✅ exec: 만들어진 복사본은 자신의 메모리 공간을 다른 프로그램으로 교체한다. exec 호출 시 코드 및 데이터 영역이 실행할 내용의 프로그램으로 바뀌고 나머지 영역은 초기화된다.
파이썬 예제 코드를 가져와 봤다.
import os
print(f"부모 프로세스 시작 (PID: {os.getpid()})")
pid = os.fork() # 자식 프로세스 생성
if pid == 0:
# 자식 프로세스
print(f"자식 프로세스 생성됨 (PID: {os.getpid()}, 부모 PID: {os.getppid()})")
# exec: 자식 프로세스를 다른 프로그램으로 덮어쓰기
os.execl("/bin/ls", "ls", "-l") # ls -l 명령 실행
# 이 아래 코드는 실행되지 않음 (execl이 성공하면 메모리 통째로 교체됨)
print("이 문장은 출력되지 않습니다.")
else:
# 부모 프로세스
print("부모는 자식이 끝날 때까지 기다림...")
os.wait() # 자식 프로세스가 끝날 때까지 대기
print("자식 종료 완료. 부모 프로세스 종료!")
파이썬으로 보니 생소한 게 좀 덜해졌다.
10-3. 스레드
✔️스레드가 뭘까?
✔️ 멀티스레드와 멀티프로세스의 차이는?
✅ 스레드: 프로세스를 구성하는 실행의 흐름 단위로, 하나의 프로세스는 여러 스레드를 가질 수 있다.
프로세스와 스레드, 멀티프로세스와 멀티스레드
이전 장까지는 하나의 프로세스는 하나의 작업 흐름을 가진다고 가정했는데, 이 작업을 단일 스레드 프로세스라고 한다.
그러나 스레드 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다. 이를 멀티 스레드 프로세스라고 하는데, 하나의 프로세스를 기반으로 여러 개의 스레드가 실행된다.
이 스레드들은 자원(코드, 데이터, 힙 영역)을 서로 공유하며, 최소한의 정보만으로 동작하게 된다.
동일한 프로세스를 여러 개 실행하면, 각각 코드/데이터/힙/스택을 별도로 가지기에 메모리를 많이 사용하게 된다. 프로세스 간 자원 공유도 어렵다. 그러나 하나의 멀티스레드 프로세스를 실행하면 스택 외의 자원들을 모두 공유할 수 있어서 메모리를 적게 사용할 수 있다. 하지만 하나의 스레드에 문제가 생겨도 전체 프로세스에 영향을 줄 수 있는 단점이 있다.
Chapter 11. CPU 스케줄링
11-1. CPU 스케줄링 개요
✔️운영체제는 CPU에 어떻게 프로세스를 배분할까?
이전 절에서 우리는 CPU가 프로세스들에 어떻게 자원을 공정하게 분배할지에 대한 물음을 가졌다.
이번 절에서 그 답을 알아보도록 하자.
✅CPU 스케줄링: OS가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것
프로세스 우선순위
프로세스를 단순히 순서대로 CPU자원을 분배하면 좋겠지만, 프로세스에는 더 중요한 것과 덜 중요한 것이 존재하기 마련이다. 따라서 우리는 프로세스 우선순위를 고려하게 된다.
✅ 입출력 집중 프로세스: 입출력 작업이 많은 프로세스로, 비디오 재생/디스크 백업 등이 있다.
✅ CPU 집중 프로세스: CPU작업이 많은 프로세스로, 복잡한 수학 연산/그래픽 처리 작업 등이 있다.
전자는 입출력을 위한 대기 상태가 더 길 것이고, 후자는 실행 상태에 더 많은 시간을 머무르게 될 것이다.
이처럼 프로세스마다 집중해야 하는 포인트가 다르기에, 동일한 빈도로 CPU를 사용하는 것은 비효율적이라고 볼 수 있다.
따라서 각자의 상황에 맞게, 프로세스의 중요도에 맞게 CPU를 사용할 수 있도록 우선순위를 부여하여, 우선순위가 높은 프로세스는 더 빠르고 자주 실행될 수 있게 한다.
스케줄링 큐
OS는 프로세스들에 줄 서서 기다릴 것을 요구하는데, 이 줄을 스케줄링 큐로 구현하고 관리한다.
예를 들어 CPU를 쓰고 싶은 프로세스 / HDD를 쓰고 싶은 프로세스 / 프린터를 쓰고 싶은 프로세스
이런 식으로 나누어 줄을 세운다. 줄=큐라고 하는데, 2가지 종류로 나뉜다:
✅ 준비 큐: CPU를 이용하고 싶은 프로세스들이 서는 줄
✅ 대기 큐: 입출력장치를 이용하기 위해 대기 상태에 접어든 프로세스들이 서는 줄
그림을 살펴보면, Job queue는 아직 메모리에 올라가기 전 상태로, 시스템에 들어온 모든 프로세스가 처음 대기하는 큐이다. Ready queue는 메모리에 올라와 CPU 할당을 기다리는 상태로, OS는 PCB들이 큐에 삽입된 순서대로 프로세스를 하나씩 꺼내되, 우선순위가 높은 것부터 실행한다. 대기 큐에서는 같은 장치를 요구한 프로세스들이 기다리고 있다.
선점형과 비선점형 스케줄링
CPU를 잘 쓰고 있는데, 갑자기 다른 프로세스가 CPU를 사용하길 요청한다면 어떻게 대처할까?
✅ 선점형 스케줄링: OS가 프로세스로부터 자원을 강제로 뺏어서 다른 프로세스에 할당할 수 있다. 즉, 자원 독점을 할 수 없는 방식이다.
✅ 비선점형 스케줄링: 하나의 프로세스가 자원을 사용 중이라면 다른 프로세스가 끼어들 수 없다. 단, 그 프로세스가 종료되거나 스스로 대기 상태에 접어든다면 다른 프로세스들이 자원을 이용할 수 있게 된다.
11-2. CPU 스케줄링 알고리즘
✔️ 스케줄링 알고리즘에 대한 다양한 아이디어를 살펴보자!
선입 선처리 스케줄링(FCFS 스케줄링; First Come First Scheduling)
준비 큐에 먼저 도착한 프로세스가 먼저 CPU를 할당받는 스케줄링이다.
예를 들어 A, B, C 순서대로 도착했다면 A가 끝날 때까지 B, C는 대기해야 한다.
중간에 뺏을 수 없는 비선점형 방식이다. 단순해 보여서 좋아보이지만, 프로세스들이 기다리는 시간이 길어질 수 있다는 단점이 있다.
✅ 호위 효과(convoy effect): 실행 시간이 긴 프로세스가 먼저 실행되면서 뒤따르는 짧은 프로세스들이 오랫동안 기다리게 되는 현상
나는 3초면 끝날 수 있는 걸, 앞에 줄 서 있는 사람이 10분이 필요하다면 난 10분을 기다리고 있어야 한다는 것이다. ㅡ.ㅡ
최단 작업 우선 스케줄링(SJF 스케줄링; Shortest Job First Scheduling)
반면 준비 큐에 삽입된 프로세스 중 CPU 이용 시간의 길이가 가장 짧은 프로세스부터 실행하는 방식을 최단 작업 우선 스케줄링이라고 한다.
A가 10초, B가 2초, C가 4초 걸린다면 B->C->A 순으로 실행된다. 평균 대기 시간을 최소화할 수 있는 장점이 있으나, 실행 시간을 현실적으로 정확히 예측하기 어렵다는 단점이 있다.
✅기아 현상(starvation): 긴 작업이 계속 밀리는 현상
라운드 로빈 스케줄링(round robin scheduling)
라운드 로빈 스케줄링은 선입 선처리 스케줄링에 타임 슬라이스 개념이 더해지는 방식이다.
모든 프로세스에 동일한 시간 할당량(Time Quantum)을 주고, 그 시간이 지나면 CPU를 뺏어서 다음 프로세스에 넘기는 선점형 스케줄링이다. 정해진 시간을 다 사용해도 아직 완료하지 못했다면 다시 큐의 맨 뒤에 삽입된다. (문맥 교환)
공정하게 CPU를 분배할 수 있지만, 시간 할당량이 너무 작으면 문맥 전환이 잦아져 오버헤드가 크고, 너무 크면 FCFS와 다를 게 없다는 단점이 있다.
최소 잔여 시간 우선 스케줄링(SRT; Shortest Remaining Time)
정해진 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스는 남아있는 작업 시간이 가장 적은 프로세스가 선택된다.
우선순위 스케줄링(priority scheduling)
프로세스에 우선순위를 부여하고, 가장 높은 우선순위를 가진 프로세스부터 실행하는 스케줄링 알고리즘이다.
중요한 작업은 빠르게 처리할 수 있지만, 우선순위가 낮은 작업은 작업을 무한정 기다리는 기아 현상이 발생할 수 있다.
이를 방지하기 위해 에이징 기법을 도입할 수 있다.
✅ 에이징(aging): 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식
다단계 큐 스케줄링(multilevel queue scheduling)
우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식이다. 실행 중인 프로세스들은 성격이 다른 점을 고려하여, 큐 별로 다른 스케줄링 알고리즘을 적용한다. 예를 들어 상호작용 프로세스는 빠른 응답이 중요하고, 시스템 프로세스는 높은 우선순위가 필요하다. 그렇다면 큐1에는 시스템 프로세스를 배정하여 라운드 로빈 방식을, 큐2에는 상호작용 프로세스를 배정하여 최단 작업 우선 스케줄링을 사용할 수 있다.
다단계 피드백 큐 스케줄링(Multilevel Feedback Queue)
여러 개의 우선순위 큐를 만들어 놓고, 프로세스의 실행 패턴에 따라 다른 큐로 이동시키는 방식이다. 즉, 프로세스들이 큐 사이를 이동할 수 있다. CPU를 오래 사용하는 CPU 집중 프로세스들은 우선순위가 낮아지고, CPU를 적게 사용하는 프로세스들은 우선순위가 높은 큐로 가게 된다. 구현이 복잡하다는 단점이 있으나, 다양한 유형의 작업에 유연하게 대응할 수 있다.
사진에서 보다시피, 각 큐는 서로 다른 우선순위를 가지며, CPU는 높은 우선순위부터 처리한다. 프로세스는 하위 큐로 내려갈 수 있고, 오랫동안 대기한 프로세스는 위로 boosting되어 기아 현상을 방지한다.
<이번 주 숙제>
1) 기본 숙제
304p 1번
1. 생성 2. 준비 3. 실행 4. 종료 5. 대기
2) 추가 숙제
FCFS는 들어온 순서가 실행 순서기 때문에,
A-B-C-D 순서로 프로세스를 실행하게 된다.
'Computer Science > 컴퓨터구조&운영체제' 카테고리의 다른 글
[혼공학습단] Week 6: 가상 메모리, 파일 시스템혼공학습단] Week 6: 가상 메모리, 파일 시스템 (2) | 2025.08.24 |
---|---|
[혼공학습단] Week 5: 프로세스 동기화, 교착 상태 (12) | 2025.08.12 |
[혼공학습단] Week 3 메모리와 보조기억장치, 입출력장치 (8) | 2025.07.30 |
[혼공학습단] Week 2: CPU의 작동원리와 성능 향상 기법 (3) | 2025.07.18 |
[혼공학습단] Week 1 (0) | 2025.07.06 |