Chapter 10. 프로세스와 스레드
목표
- 프로세스 제어 블록이란 무엇인지 이해한다.
- 문맥 교환의 정의와 과정을 학습한다.
- 프로세스는 메모리에 어떻게 배치되는지 학습한다.
- 프로세스 상태와 프로세스 계층 구조를 학습한다.
- 스레드의 개념을 이해하고, 멀티 프로세스와 멀티 스레드의 차이를 이해한다.
01. 프로세스 개요
1. 프로세스
- 실행 중인 프로그램
- 프로세스 생성 : 보조기억 장치에 저장된 프로그램을 메모리에 적재하고 실행
2. 포그라운드 프로세스 foreground process
- 사용자가 볼 수 있는 공간에서 실행되는 프로세스 ex. 메모장, 크롬 등
3. 백그라운드 프로세스 background process
- 사용자가 볼 수 없던 공간에서 실행되는 프로세스
- 종류
- 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
- 데몬daemon(unix), 서비스service(window) : 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스
4. 프로세스 제어 블록 PCB 출연 배경
- 모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU 자원은 한정적 -> 프로세스들은 돌아가며 한정된 시간만큼만 CPU 이용
= 자신의 차례에 정해진 시간만큼 CPU 이용, 타이머 인터럽트(타임아웃 인터럽트) 발생 시 차례 양보
= 빠르게 번갈아 수행되는 프로세스들을 관리하고 프로세스에 CPU를 비롯한 자원 배분 시 PCB를 이용
5. 프로세스 제어 블록 PCB 이란
- 프로세스 관련 정보를 저장하는 자료 구조 (= 상품 태그)
- 해당 프로세스 식별을 위해 꼭 필요한 정보들이 저장됨
- 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기 -> 운영체제는 커널 영역에 적재된 PCB를 보고 프로세스를 관리
6. PCB에 담기는 대표적인 정보
- 프로세스 ID (=PID)
- 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값
- 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 -> 실행 재개
- ex.프로그램 카운터, 스택 포인터 등
- 프로세스 상태
- 입출력 장치를 사용하기 위해 기다리는 상태
- CPU를 사용하기 위해 기다리는 상태
- CPU를 이용 중인 상태, ...
- CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
- 메모리 정보
- 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
- 페이지 테이블 정보
- 사용한 파일과 입출력장치 정보
- 할당된 입출력장치, 사용 중인(열린) 파일 정보
7. 문맥 교환 context switch
- 한 프로세스(e.g. 프로세스 A)에서 다른 프로세스(e.g. 프로세스 B)로 실행 순서가 넘어가면 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업함 ex. 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등
=> 이때 중간 정보 : 문맥 context
- 문맥 교환 context switch : 기존의 실행 중인 프로세스 문맥을 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정
8. 문맥 context
- 다음 차례가 왔을 때 실행을 재개하기 위한 정보
- 실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있음
9. 프로세스의 메모리 영역
- 코드 영역 (=텍스트 영역), 데이터 영역, 힙 영역, 스택 영역
10. 코드 영역 = 텍스트 영역
- 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read-only)
- 정적 할당 영역 (크기 고정)
11. 데이터 영역
- 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장 ex. 전역 변수
- 정적 할당 영역 (크기 고정)
12. 힙 영역
- 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역 메모리 할당 후 언젠가는 메모리 공간 반환 필요
-> 그렇지 않을 경우 메모리 누수 Memory leak 발생
- 동적 할당 영역 (크기 가변)
- 일반적으로 힙 영역은 낮은 주소 -> 높은 주소로 할당
13. 스택 영역
- 데이터가 일시적으로 저장되는 공간
- (데이터 영역에 담기는 값과는 달리) 잠깐 쓰다가 말 값들이 저장되는 공간
ex. 매개 변수, 지역 변수
- 동적 할당 영역 (크기 가변)
- 일반적으로 스택 영역은 높은 주소 -> 낮은 주소로 할당
02. 프로세스 상태와 계층 구조
1. 프로세스 상태
- 운영체제는 프로세스의 상태를 PCB를 통해 인식 및 관리
2. 생성 상태 new
- 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비가 완료되었다면 준비 상태로 변환
3. 준비 상태
- 당장이라도 CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니기 때문에 기다리는 상태
- 자신의 차례가 된다면 실행 상태로 변환 (=디스패치)
4. 실행 상태
- CPU를 할당 받아 실행 중인 상태
- 할당된 시간 모두 사용 시(타이머 인터럽트 발생 시) 준비 상태로 변환
- 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로 변환
5. 대기 상태 block state
- 프로세스가 실행 도중 입출력장치를 사용하는 경우, 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 변환
- 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로 변환
6. 종료 상태
- 프로세스가 종료된 상태
- PCB, 프로세스의 메모리 영역 정리
7. 프로세스 계층 구조
- 프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능
- 부모 프로세스: 새 프로세스를 생성한 프로세스
- 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
- 부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가짐
- 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID) 명시하기도
- 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있음 -> 계층 구조 형성
8. 프로세스 생성 기법
- 복제와 옷 갈아입기 : 생성된 자식 프로세스들이 실행되는 법
9. 복제와 옷 갈아입기
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
- 복사본 (= 자식 프로세스) 생성
-부모 프로세스의 자원 상속
- PID, 저장되어 있는 메모리의 위치 등은 다름 (별개의 프로세스이기 때문에)
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
- 메모리 공간을 새로운 프로그램으로 덮어쓰기
- 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화
10. 스레드
- 프로세스를 구성하는 실행 흐름의 단위
- 하나의 프로세스는 하나 이상의 스레드를 가질 수 있음
11. 프로세스와 스레드
- 단일 스레드 프로세스 : 실행 흐름이 하나인 프로세스
- 멀티 스레드 프로세스
- 실행 흐름이 여러 개인 프로세스
- 프로세스를 이루는 여러 명령어 동시 실행 가능
- 프로세스를 이루는 스레드들은 프로세스의 자원을 공유하면서 실행됨
12. 스레드의 구성 요소
- 실행에 필요한 최소한의 정보 ex. 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등
13. 멀티 프로세스와 멀티 스레드
14. 멀티 프로세스
- 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행
- 프로세스끼리는 자원을 공유하지 않음 (독립적으로 실행)
- 프로세스를 fork하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨
- 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재
- fork를 세번, 네번하면 메모리에는 같은 프로세스가 통째로 세개, 네개 적재
15. 멀티 스레드
- 하나의 프로세스를 여러 스레드로 실행
- 스레드들은 각기 다른 스레드 ID, (별도의 실행을 위해 꼭 필요한) 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원을 공유
- 협력과 통신에 유리, 때로는 문제가 될 수 있음
Chapter 11. CPU 스케줄
목표
- 프로세스 우선순위를 이해한다.
- 스케줄링 큐의 개념과 필요성을 학습한다.
- 선점형 스케줄링과 비선점형 스케줄링의 차이를 이해한다.
- 다양한 CPU 스케줄링 알고리즘을 학습한다.
01. CPU 스케줄링 개요
1. CPU 스케줄링
- 운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것
- 컴퓨터 성능과 직결됨
2. 프로세스 우선순위
- 프로세스는 우선순위에 따라 처리해야 함
- 입출력 집중 프로세스 I/O bound process
- 입출력 작업이 많은 프로세스 ex. 비디오 재생, 디스크 백업 작업 -> 실행 상태 < 대기 상태
- CPU 집중 프로세스 CPU bound process
- CPU 작업이 많은 프로세스 ex. 복잡한 수학 연산, 컴파일, 그래픽 처리 작업 등 -> 실행 상태 > 대기 상태
- 프로세스는 CPU 버스트와 입출력 버스트를 반복하며 실행됨
3. 스케줄링 큐
- 운영체제는 메모리로 적재되고 싶은(신규) 프로세스들을 큐에 삽입하여 줄 세움
- CPU를 이용하고 싶은 프로세스들을 큐에 삽입하여 줄 세움
- 특정 입출력장치를 이용하고 싶은 프로세스들을 큐에 삽입하여 줄 세움
- 준비 큐 ready queue
- CPU를 이용하고 싶은 프로세스들이 서는 줄
- 대기 큐 waiting queue
- 입출력장치 이용을 위해 대기 상태에 접어든 프로세스들이 서는 줄
- 프로세스 상태 다이어그램
4. 선점형 스케줄링
- 프로세스가 CPU를 비롯한 자원을 사용하고 있더라고 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링 방식
= 한 프로세스가 자원 사용을 독점할 수 없는 스케줄링 방식
- 프로세스들에 골고루 자원 배분이 가능하나, 문맥 교환 과정에서 오버헤드 발생 위험성이 존재
5. 비선점형 스케줄링
- 하나의 프로세스가 자원을 사용 중이라면 그 프로세스가 종료 / 대기상태에 접어들기 전까지 다른 프로세스가 끼어들 수 없는 스케줄링 방식
= 한 프로세스가 자원 사용을 독점할 수 있는 스케줄링 방식
- 문맥 교환 과정에서 발생하는 오버헤드는 비교적 적지만, 모든 프로세스가 자원을 골고루 사용할 수 없음
'공부 > TIL' 카테고리의 다른 글
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 12 - 13 (2) | 2023.10.17 |
---|---|
한입 크기로 잘라 먹는 타입스크립트 : 함수와 타입 (0) | 2023.09.15 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 8 - 9 (0) | 2023.09.02 |
한입 크기로 잘라 먹는 타입스크립트 : 타입스크립트 이해하기 (0) | 2023.08.18 |
한입 크기로 잘라 먹는 타입스크립트 : 타입스크립트 기본 (0) | 2023.08.14 |