CH10 프로세스와 스레드
10-1 프로세스 개요
프로그램은 실행되기 전까지는 보조기억장치에 있는 데이터 덩어리일 뿐이지만
메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다
이 과정을 프로세스를 생성한다고 한다
포그라운드 프로세스 Foreground Process
사용자가 볼 수 있는 공간에서 실행되는 프로세스
백그라운드 프로세스 Background Process
사용자가 볼 수 없는 공간에서 실행되는 프로세스
1) 사용자와 직접 상호작용이 가능한 백그라운드 프로세스 - 데몬 Daemon, 서비스 Service
2) 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스
프로세스 제어 블록
모든 프로세스는 실행을 위해 CPU가 필요하지만, CPU 자원은 한정되어 있다
PCB에 담기는 대표적인 정보
프로세스 ID, PID
특정 프로세스를 식별하기 위해 부여하는 고유한 번호 (학교의 학번, 회사의 사번)
레지스터 값
프로세스는 자신의 실행 차례가 다시 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 -> 실행 재게
(프로그램 카운터, 스택 포인터 등) 프로그램 카운터에 다음번에 실행할 메모리의 주소가 담긴다
프로세스 상태
입출력 장치를 사용하기 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태, CPU 이용 중인 상태 등
CPU 스케줄링 정보
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
메모리 정보
프로세스가 어느 주소에 저장되어 있는지에 대한 정보
페이지 테이블 정보 (메모리 주소를 알 수 있는 정보)
사용한 파일과 입출력장치 정보
할당된 입출력장치, 사용 중인 (열린) 파일 정보
문맥 교환 Context Switch 중요!
한 프로세스 (Process A) 에서 다른 프로세스 (Process B) 로 실행 순서가 넘어가면?
기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업
- 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등
- 이러한 중간 정보를 문맥 Context 이라고 한다
- 다음 차례가 왔을 때 실행을 재개하기 위한 정보
- 실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다
뒤이어 실행할 프로세스 B의 문맥을 복구
- 자연스럽게 실행 중인 프로세스가 바뀐다
이처럼 기존의 실행 중인 프로세스 문맥을 백업하고
새로운 프로세스 실행을 위해 문맥을 복구하는 과정을
문맥 교환 Context Switching 이라고 한다
(여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리)
프로세스의 메모리 영역
크게 코드 영역 (=텍스트 영역), 데이터 영역, 힙 영역, 스택 영역
코드 영역 = 텍스트 영역
실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
데이터가 아닌 CPU가 실행할 명령어가 담기기에, 쓰기가 금지된 영역 (Read-Only)
데이터 영역
잠깐 썼다가 없앨 데이터가 아닌, 프로그램이 실행되는 동안 유지할 데이터 저장 ex. 전역 변수
코드 영역과 데이터 영역은 크기가 고정되어 있다 - 정적 할당 영역
힙 영역
프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간
가비지 컬렉션 Garbage Collection 이 없다면, 반드시 반납해야 한다
영역을 사용한 뒤 반납하지 않으면 메모리 누수 Memory Leak 이 발생한다
스택 영역
데이터가 일시적으로 저장되는 공간
(데이터 영역에 담기는 값과 달리) 잠깐 쓰다가 말 값들이 저장되는 공간 ex. 매개 변수, 지역 변수
힙 영역과 스택 영역은 크기가 변할 수 있다 - 동적 할당 영역
힙 영역과 스택 영역의 크기는 가변적
일반적으로 힙 영역은 낮은 주소 -> 높은 주소로 할당
일반적으로 스택 영역은 높은 주소 -> 낮은 주소로 할당
10-2 프로세스 상태와 계층 구조
프로세스 상태
* 프로세스의 상태는 운영체제마다 조금씩 차이가 있다
생성 상태
이제 막 메모리에 적재되어 PCB를 할당받은 상태
준비가 완료되었다면 준비 상태로
준비 상태
당장이라도 CPU를 할당받아 실행할 수 있지만
자신의 차례가 아니기에 기다리는 상태
자신의 차례가 된다면 실행 상태로 (= 디스패치)
실행 상태
CPU를 할당받아 실행 중인 태
할당된 시간 모두 사용 시 (타이머 인터럽트 발생 시) 준비 상태로
실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로
대기 상태
프로세스가 실행 도중 입출력장치를 사용하는 경우
입추력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬
입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로
종료 상태
프로세스가 종료된 상태
PCB 폐기, 프로세스의 메모리 영역 정리
프로세스 계층 구조
프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능
부모 프로세스 - 새 프로세스를 생성한 프로세스
자식 프로세스 - 부모 프로세스에 의해 생성된 프로세스
* 윈도우 운영체제는 프로세스를 계층적으로 관리하지 않는다
부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID 를 가진다
일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID (PPID, Parent PID) 를 명시하기도 한다
자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있다 -> 프로세스의 계층적인 구조 형성
프로세스 생성 기법
부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
완전한 복사본이 만들어지긴 하지만, 완전히 별개의 프로세스이기 때문에 PID, 저장된 위치 등은 다르다
자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
exec 시스템 호출
메모리 공간을 새로운 프로그램으로 덮어쓰기
코드/ 데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화
부모 프로세스가 fork() 호출을 통해 복사본을 자식 프로세스로 만들고 (현재는 부모와 자식 동일)
그 자식 프로세스는 exec() 호출을 통해 자식 프로세스의 프로그램 내용들을 새로운 프로그램으로 바꾼다
+ 자식 프로세스가 exec() 호출을 하지 않고 그대로 사용하는 경우도 있는데,
동일한 일을 수행하는 프로세스가 병행 실행되는 구조라고 볼 수 있다
10-3 스레드
'크래프톤정글 > 혼공컴운' 카테고리의 다른 글
[혼공컴운] CH09 운영체제 시작하기 (0) | 2024.10.16 |
---|---|
[혼공컴운] CH08 입출력장치 (1) | 2024.10.14 |
[혼공컴운] CH07 보조기억장치 (1) | 2024.10.09 |
[혼공컴운] CH06 메모리와 캐시 메모리 (4) | 2024.10.08 |
[혼공컴운] CH05 CPU 성능 향상 기법 (1) | 2024.10.07 |