Chapter 10 프로세스와 스레드
1. 프로세스 개요
프로세스/ 프로세스 제어 블록/ 문맥 교환/ 프로세스 사용자 영역
프로세스(process)
실행 중인 프로그램
- 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process): 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
- 데몬(daemon)_유닉스/ 서비스(service)_윈도우: 사용자와 상호작용 X 정해진 일만 수행
프로세스 제어 블록(PCB; Process Control Block)
모든 프로세스는 실행 위해 CPU 필요로 함
But, CPU 자원 한정되어 있음 = 모든 프로세스 CPU 동시에 사용 X
-> 프로세스 돌아가며 한정된 시간만큼만 CPU 이용
*타이머 인터럽트 = 타임아웃 인터럽트: 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
=> 여러 프로세스 관리
문맥(context)
- 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- 하나의 프로세스 문맥 -> 해당 프로세스의 PCB에 표현
=> 실행 문맥 잘 기억하면 해당 프로세스 실행 언제든 재개 O
-> 인터럽트 발생 -> 운영체제) 해당 프로세스의 PCB에 문맥 백업
문맥 교환(context switching)
- 기존 프로세스의 문맥 -> PCB에 백업,
새로운 프로세스 실행하기 위해 문맥을 PCB로부터 복구 -> 새로운 프로세스 실행
=> 프로세스 간에 실행 전환 - 여러 프로세스가 끊임X 빠르게 번갈아 가며 실행되는 원리
- 자주 일어나면 -> 동시에 실행되는 것처럼 보임 But, 오버헤드 발생할 수 있음
프로세스의 메모리 영역
프로세스 생성 -> 커널 영역: PCB 생성/ 사용자 영역: 프로세스 어떻게 배치?
- 코드 영역(code segment) = 텍스트 영역(text segment)
- 실행할 수 있는 코드(기계어)로 이뤄진 명령어 저장
- CPU가 실행할 명령어 -> 쓰기 X => 읽기 전용(read-only) 공간
- 정적 할당 영역
- 데이터 영역(data segment)
- 전역 변수(global variable) 저장
- 프로그램이 실행되는 동안 유지, 프로그램 전체에 접근할 수 있는 변수
- 정적 할당 영역
- 전역 변수(global variable) 저장
- 힙 영역(heap segment)
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 해당 메모리 공간 반환해야 함
- 더 이상 해당 메모리 공간 사용하지 X
- IF. 반환 X -> 메모리 누수(memory leak): 메모리 낭비
- 동적 할당 영역
- 메모리) 낮은 주소 -> 높은 주소 할당
- 스택 영역(stack segment)
- 데이터를 일시적으로 저장하는 공간(지역변수)
- 동적 할당 영역
- 메모리) 높은 주소 -> 낮은 주소
정적 할당 영역: 크기가 고정된 영역
동적 할당 영역: 프로세스 실행 과정에서 크기 변할 수 O
2. 프로세스 상태와 계층 구조
프로세스 상태/ 부모 프로세스/ 자식 프로세스/ 프로세스 계층 구조
프로세스 상태
- 생성 상태(new)
- 프로세스 생성 중인 상태
- 이제 막 메모리에 적재되어 PCB 할당 받은 상태
- 준비 상태(ready)
- 당장이라도 CPU 할당받아 실행할 수 있지만, 차례가 X -> 기다리고 있는 상태
- 디스패치(dispatch): 준비 상태인 프로세스 -> 실행 상태
- 실행 상태(running)
- CPU를 할당받아 실행 중인 상태
- 할당된 일정 시간 동안만 CPU 사용할 수 있음
- 시간 모두 사용(타이머 인터럽트 발생) -> 준비 상태
/ 실행 중 입출력장치 사용 -> 입출력장치 작업 끝날 대까지 기다려야 함 -> 대기 상태
- 대기 상태(blocked)
- 입출력장치의 작업을 기다리는 상태
- 입출력 작업 완료 -> 다시 준비 상태로 CPU 할당 기다림
- 종료 상태(terminated)
- 프로세스가 종료된 상태
- 프로세스 종료 -> 운영체제) PCB와 프로세스가 사용한 메모리 정리
프로세스 계층 구조
- 부모 프로세스(parent process): 새 프로세스를 생성한 프로세스
- 자식 프로세스(child process): 부모 프로세스에 의해 생성된 프로세스
-> 각기 다른 PID 가짐
일부 운영체제: 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Parent PID)가 기록되기도 함
프로세스 생성 기법
시스템 호출: fork, exec
- 부모 프로세스) fork ~> 자신의 복사본을 자식 프로세스로 생성
- 자식 프로세스) exec ~> 자신의 메모리 공간을 다른 프로그램에 대해 교체
- 부모 프로세스의 복사본 -> 부모 프로세스의 자원(메모리 내용, 열린 파일 목록 등) -> 자식 프로세스에 상속
- But, PID 값이나 저장된 메모리 위치는 다름
부모가 자식 프로세스 실행하며 프로세스 계층 구조를 이루는 과정
= fork와 exec가 반복되는 과정
3. 스레드
스레드/ 멀티프로세스/ 멀티스레드
(전통적 관점) 프로세스는 한 번에 하나의 일만 처리
= 하나의 실행 흐름 가지고 한 번에 하나의 부분만 실행하는 프로세스: 단일 스레드 프로세스
스레드(thread)
- 실행의 단위
- 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드 가질 수 있음
- 하나의 프로세스가 한 번에 여러 일 동시에 처리 O
- 프로세스 구성하는 여러 명령어 동시에 실행 O
실행에 필요한 최소한의 정보(프로그램 카운터 포함한 레지스터, 스택)만 유지, 프로세스 자원 공유하며 실행됨
스레드 1만의 코드/데이터/힙 영역, 스레드 2만의 코드/데이터/힙 영역 X
=> 프로세스: 실행되는 프로그램/ 스레드: 프로세스를 구성하는 실행의 흐름 단위
-> CPU에 처리할 작업 전달 시 프로세스 X 스레드 단위 O 전달
=> 스레드) 프로세스 자원 공유, 실행에 필요한 최소한의 정보만으로 실행
- 멀티프로세스(multiprocess): 여러 프로세스 동시에 실행하는 것
- 하나의 프로세스에 문제 -> 다른 프로세스 지장 ↓ or X
- 멀티스레드(multithread): 여러 스레드로 프로세스를 동시에 실행하는 것
- 하나의 스레드 문제 -> 프로세스 전체에 문제 생길 수 O
=> 모든 스레드는 프로세스 자원 공유(서로 영향 O)
- 하나의 스레드 문제 -> 프로세스 전체에 문제 생길 수 O
Q. 동일한 작업 수행하는 단일 스레드 프로세스 여러 개 vs. 하나의 프로세스 여러 스레드로 실행 차이 ?
A. 차이 O
프로세스: 자원 공유 X/ 스레드: 같은 프로세스 내의 자원 공유 O
프로세스 fork -> 같은 작업 하는 동일한 프로세스 2개 동시 실행
=> 코드 영역, 데이터 영역, 힙 영역 등 모든 자원 복제돼 메모리에 저장(PID, 저장된 메모리 주소 제외): 낭비
스레드: 다른 스레드 ID, 프로그램 카운터 값 포함한 레즈스터 값, 스택 가질 뿐 프로세스가 가지고 있는 자원 공유
= 동일한 주소 공간의 코드, 데이터, 힙 영역 공유, 열린 파일과 같은 프로세스 자원 공유
=> 메모리 더 효율적으로사용할 수 있음, 협력과 통신에 유리
*프로세스 간 통신(IPC; Inter-Process Communication)
: 프로세스 간의 자원을 공유하고 주고받는 것
/ 공유 메모리(shared memory): 프로세스들이 공유할 수 있는 메모리 영역
출처
'Computer Science > 컴퓨터구조 | 운영체제' 카테고리의 다른 글
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 12 프로세스 동기화 (0) | 2024.07.25 |
---|---|
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 11 CPU 스케줄링 (1) | 2024.07.09 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 09 운영체제 시작하기 (0) | 2024.07.09 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 08 입출력장치 (0) | 2024.01.08 |
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 07 보조기억장치 (0) | 2024.01.08 |