기본 미션
p.304의 확인 문제 1번 풀고 인증하기
- 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. ①부터 ⑤까지 올바른 상태를 적어보세요.
정답 ① 생성 상태, ② 준비 상태, ③ 실행 상태, ④ 종료 상태, ⑤ 대기 상태
선택 미션
ch11(11-2) 준비 큐에 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케쥴링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
정답:
선입 선처리 스케줄링 알고리즘은 준비 큐에 삽입된 순서대로 CPU를 할당함
-> A-B-C-D 순으로 CPU를 할당받음
내용 정리
9-1. 운영체제를 알아야 하는 이유
- 운영체제: 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
- 운영체제와의 대화를 통해 하드웨어와 프로그램을 더 깊이 이해하고 문제 해결의 실마리를 찾을 수 있음
- 운영체제는 메모리 내 커널 영역 (kernel space)에 적재됨
- 사용자 영역 (user space)에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 관리하는 역할
9-2. 운영체제의 큰 그림
- 커널 (kernel): 운영체제의 핵심 기능을 담당
- 이중 모드 (dual mode): CPU가 명령어를 실행하는 모드를 커널 모드 (kernel mode)와 사용자 모드 (user mode)로 구분하는 방식
- 시스템 호출 (system call): 운영체제의 서비스를 제공받기 위해 커널 모드로 전환하는 방법
- 대표적인 운영체제 서비스로 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리가 있음
- 운영체제의 핵심 서비스는 커널 모드로 실행
- 일반적인 응용 프로그램은 사용자 모드로 실행
- 시스템 호출을 통해 사용자 모드에서 커널 모드로 전환할 수 있음
- 시스템 호출은 일종의 인터럽트이며, 소프트웨어적인 인터럽트임
- 사용자 인터페이스는 운영체제에서 제공하는 서비스지만, 커널에 포함되지 않음 (GUI, CLI)
10-1. 프로세스 개요
- 프로세스: 실행 중인 프로그램
- 운영체제는 프로세스 제어 블록 (PCB: Process Control Block)을 통해 여러 프로세스를 관리
- 문맥 교환: 프로세스 간에 실행을 전환하는 것
- 프로세스 사용자 영역
프로세스 제어 블록 (PCB)
프로세스와 관련된 정보를 저장하는 자료 구조이며 커널 영역에 생성됨
- 프로세스 ID (PID: Process ID)
- 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값
- 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원 -> 이전까지 진행했던 작업들을 그대로 이어 실행할 수 있음
- PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터, 스택 포인터 등을 비롯한 레지스터 값들이 담김
- 프로세스 상태
- CPU 스케쥴링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록
- 메모리 관리 정보
- 프로세스가 어느 주소에 저장되어 있는지에 대한 정보 저장
- 사용한 파일과 입출력장치 목록
- 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시됨
문맥 교환 (context switching)
기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
(문맥: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보)
프로세스의 메모리 영역
(동적 할당 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있음)
- 코드 영역 (code segment)
- 기계어로 이루어진 명령어(CPU가 실행할 명령어) 저장
- 쓰기 금지, 읽기 전용 (read-only) 공간
- 데이터 영역 (data segment)
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
ex) 전역 변수 (global variable)
- 힙 영역
- 사용자가 직접 할당할 수 있는 저장 공간
- 언젠가는 해당 공간 반환해야 함
ex) 가비지 컬렉션
반환하지 않으면 메모리 낭비 초래 -> 메모리 누수 (memory leak)
- 스택 영역
- 데이터를 일시적으로 저장하는 공간
ex) 매개 변수, 지역 변수
❓ Java의 가비지 컬렉션
GC(Garbage Collection) 진행 방법
1. Eden 영역에서 객체가 생성됨
2. Eden 영역이 꽉 차면 살아있는 객체만 Survivor 영역으로 복사되고, 다시 Eden 영역을 채우게 됨
3. Survivor 영역이 꽉 차게 되면 다른 Survivor 영역으로 객체가 복사됨. 이때, Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 감. 즉, Survivor 영역의 둘 중 하나는 반드시 비어 있어야만 함.
10-2. 프로세스 상태와 계층 구조
- 프로세스 상태에는 생성, 준비, 실행, 대기, 종료가 있음
- 프로세스가 다른 프로세스를 생성한 경우 프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 부름
- 많은 운영체제는 프로세스가 프로세스를 낳는 프로세스 계층 구조로 프로세스들을 관리
프로세스 상태
- 생성 상태 (new)
- 이제 막 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태 (ready)
- CPU를 할당받기를 기다리고 있는 상태
- 디스패치 (dispatch): 준비 상태인 프로세스가 실행 상태로 전환되는 것
- 실행 상태 (running)
- CPU를 할당받아 실행 중인 상태
- 프로세스가 할당된 시간을 모두 사용한다면(타이머 인터럽트가 발생하면) 다시 준비 상태가 됨
- 실행 도중 입출력장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 됨
- 대기 상태 (blocked)
- 특정 이벤트가 일어나길 기다릴 때 프로세스는 대기 상태가 됨
- 프로세스가 대기 상태가 되는 대부분의 원인이 입출력 작업임
- 입출력작업은 CPU에 비해 처리 속도가 느리기에, 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝낼 때까지 (입출력 완료 인터럽트를 받을 때까지) 기다려야 함
- 종료 상태 (terminated)
- 프로세스가 종료되는 상태
- 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리함
프로세스 계층 구조
- 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
- 새 프로세스를 생성한 프로세스를 부모 프로세스 (parent process)
- 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스 (child process)
프로세스 생성 기법
- fork 시스템 호출을 하면 부모 프로세스의 복제본이 자식 프로세스로서 생성됨
- exec 시스템 호출을 하면 프로세스의 메모리 공간이 다른 프로세스의 내용으로 변경됨
- 많은 운영체제는 fork와 exec를 통해 프로세스 계층 구조를 형성함
10-3. 스레드
- 스레드: 프로세스 내의 실행 흐름 단위
- 멀티프로세스: 여러 프로세스를 동시에 실행하는 것
- 멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것
스레드
- 프로세스 내의 실행의 흐름 단위
- 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성됨 -> 스레드마다 각기 다른 코드 실행 가능
- 프로세스 자원을 공유한 채(코드/데이터/힙 영역) 실행에 필요한 최소한의 정보만으로 실행됨
- 최근 많은 운영체제는 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달
멀티프로세스와 멀티스레드
- 프로세스끼리는 기본적으로 자원을 공유하지 않음
- 쓰기 시 복사 (copy on write) 기법 (fork를 한 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법)도 있음
- 스레드끼리는 같은 프로세스 내의 자원을 공유함
- 서로 협력과 통신에 유리
- 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받음
11-1. CPU 스케줄링 개요
- CPU 스케줄링 (CPU scheduling): 공정하고 합리적으로 CPU 자원을 배분하는 방법을 의미
- 프로세스는 우선순위를 가지고 있고, 이는 PCB에 명시됨
- 운영체제는 효율적인 스케줄링을 위해 스케줄링 큐를 사용함
- 준비 큐 (ready queue): CPU 할당을 기다리는 프로세스들을 위한 큐를 의미
- 대기 큐 (waiting queue): 입출력장치를 기다리는 프로세스들을 위한 큐를 의미
- 선점형 스케줄링 (preemptive scheduling): 프로세스가 이용 중인 자원을 빼앗을 수 있음
- 비선점형 스케줄링 (non-preemptive scheduling): 프로세스가 이용 중인 자원을 빼앗을 수 없음
프로세스 스케줄링
- 운영체제는 우선순위를 토대로 프로세스들을 스케줄링함
- 운영체제는 스케줄링 큐를 사용하여 스케줄링할 프로세스들을 관리
- 준비 큐에는 준비 상태인 프로세스들이, 대기 큐에는 대기 상태인 프로세스들이 삽입됨
선점형과 비선점형 스케줄링
- 선점형 스케줄링은 어느 한 프로세스가 자원을 독점할 수 있는 스케줄링 방식
- 문맥 교환 과정의 오버헤드가 비선점형 스케줄링에 비해 더 큼
- 비선점형 스케줄링은 어느 한 프로세스가 자원을 독점할 수 없는 스케줄링 방식
- 문맥 교환 과정의 오버헤드가 선점형 스케줄링에 비해 적음
11-2. CPU 스케줄링 알고리즘
- 선입 선처리 스케줄링 (First Come First Served Scheduling) 알고리즘: 준비 큐에 삽입된 순서대로 CPU를 할당
- 최단 작업 우선 스케줄링 (SJF: Shortest Job First Scheduling) 알고리즘: 준비 큐에 삽입된 프로세스들 중 CPU 사용 시간의 길이가 가장 짧은 프로세스부터 CPU를 할당
- 라운드 로빈 스케줄링 (round robin scheduling) 알고리즘: 정해진 시간만큼만 돌아가며 CPU를 할당
- 우선순위 스케줄링 (priority scheduling) 알고리즘: 가장 높은 우선순위를 가진 프로세스에 CPU를 할당
- 다단계 피드백 큐 스케줄링 (multilivel feedback queue scheduling) 알고리즘: 프로세스들이 큐 사이를 이동할 수 있는 다단계 큐 스케줄링
선입 선처리 스케줄링 (First Come First Served Scheduling)
- 단순히 준비 큐에 삽입된 순서대로 처리하는 비선점 스케줄링
- 먼저 CPU를 요청한 프로세스부터 CPU 할당
- 단점: 프로세스들이 기다리는 시간이 매우 길어질 수 있다는 부작용
-> 호위 효과 (convoy effect)
최단 작업 우선 스케줄링 (SJF 스케줄링: Shortest Job First Scheduling)
- CPU 사용 시간이 가장 짧은 프로세스부터 처리하는 스케줄링 방식
- 호위 효과를 방지하려면?
-> CPU 사용이 긴 프로세스는 나중에 실행, CPU 사용 시간이 짧은 프로세스는 먼저 실행
라운드 로빈 스케줄링 (Round Robin Schedling)
- 선입 선처리 스케줄링 + 타임 슬라이스 (time slice)
- 타임 슬라이스: 각 프로세스가 CPU를 사용할 수 있는 정해진 시간
- 정해진 타임 슬라이스만큼의 시간동안 돌아가며 CPU를 이용하는 선점형 스케줄링
- 큐에 삽입된 프로세스들은 순서대로 CPU를 이용하되 정해진 시간만큼만 이용
- 정해진 시간을 모두 사용하였음에도 아직 프로세스가 완료되지 않았다면 다시 큐의 맨 뒤에 삽입 (문맥교환)
-> 타임 슬라이스의 크기가 중요
최소 잔여 시간 우선 스케줄링 (SRT 스케줄링: Shortest Remaining Time Scheduling)
- 최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링
- 최단 작업 우선 스케줄링: 작업 시간이 짧은 프로세스부터 처리하는 스케줄링 알고리즘
- 라운드 로빈 스케줄링: 정해진 타임 슬라이스만큼 돌아가며 사용하는 스케줄링 알고리즘
-> 정해진 시간만큼 CPU를 이용하되, 다음으로 CPU를 사용할 프로세스로는 남은 작업 시간이 가장 적은 프로세스 선택
우선순위 스케줄링 (Priority Scheduling)
-
프로세스들에 우선순위를 부여하고, 우선순위 높은 프로세스부터 실행
-
우선순위가 같은 프로세스들은 선입 선처리로 스케줄링
-
(최단 작업 우선 스케줄링, 최소 잔여 시간 스케줄링) ⊂ 우선순위 스케줄링
-
우선순위 스케줄링의 근본적인 문제점 -> 기아 (starvation) 현상
- 우선순위 높은 프로세스만 주구장창 실행
- 우선순위 낮은 프로세스는 (준비 큐에 먼저 삽입되었음에도 불구하고) 실행 연기
-> 이를 방지하기 위한 기법: 에이징 (aging)
다단계 큐 스케줄링 (Multilevel Queue Scheduling)
- 우선순위 스케줄링의 발전된 형태
- 우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식
- 우선순위가 가장 높은 큐에 있는 프로세스를 먼저 처리
- 우선순위가 가장 높은 큐가 비어 있으면 그 다음 우선순위 큐에 있는 프로세스 처리
다단계 피드백 큐 스케줄링 (Multilevel Feedback Queue Scheduling)
- 다단계 큐 스케줄링의 발전된 형태
- 큐 간의 이동이 가능한 다단계 큐 스케줄링
- 다단계 큐 스케줄링에서는 기본적으로 큐 간의 이동 불가
- 우선순위 낮은 프로세스는 계속해서 실행 연기 우려
- 기아 현상 발생 가능
- 자연스럽게 CPU 집중 프로세스의 우선순위는 상대적으로 낮아지고, 입출력 집중 프로세스의 우선순위는 상대적으로 높아짐
- 다단계 피드백 큐에서의 에이징 기법 적용
- 어떤 프로세스의 CPU 시간이 길면 우선순위가 낮아지고, 어떤 프로세스가 낮은 우선순위 큐에서 너무 오래 기다리면 우선순위를 높이는 방식
- CPU 스케줄링 방식으로 알려져 있음