10. 프로세스와 스레드
10-1. 프로세스 개요
프로세스 : 실행중인 프로그램
- 프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐, 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 됨
→ ‘프로세스를 생성한다’ 라고 표현
프로세스 직접 확인하기
- 컴퓨터 부팅 순간, 수많은 프로세스들이 실행됨
- 포그라운드 프로세스(foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process) : 사용자가 보지 못하는 뒤 편에서 실행되는
- 사용자와 상호작용하지 않고 그저 묵묵히 정해진 일만 수행하는 백그라운드 프로세스
- 윈도우 : 서비스(service) 라고 함
- 유닉스 : 데몬(daemon) 이라고 함
프로세스 제어 블록
운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리, 프로세스에 CPU를 비롯한 자원을 배분하기 위해 프로세스 제어 블록(PCB; Process Control Block (이하 PCB)) 을 이용
- PCB는 커널 영역에 생성
- 운영체제도 수많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단
- PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기
- ‘새로운 프로세스가 생성되었다’ = ‘운영체제가 PCB를 생성했다’
- ‘프로세스가 종료되었다’ = ‘운영체제가 해당 PCB를 폐기했다’
[PCB에 담긴 대표적인 정보들]
- 프로세스 ID
- 레지스터 값
- 프로세스 상태
- CPU 스케줄링 정보
- 메모리 관리 정보
- 사용한 파일과 입출력장치 목록
문맥 교환
- 문맥(context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- 문맥 교환(context switching) : 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
프로세스의 메모리 영역
하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역,
스택 영역 으로 나뉘어 저장
[코드 영역(code segment)]
- 텍스트 영역(text segment) 이라고도 함
- 기계어로 이루어진 명령어가 저장
- 코드 영역은 읽기 전용(read-only) 공간
- 정적 할당 영역
[데이터 영역(data segment)]
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 전역 변수(global variable)가 대표적인 데이터
- ‘프로그램이 실행되는 동안 유지되며, 프로그램 전체에서 접근할 수 있는 변수’
→ 12장에서 설명
- 정적 할당 영역
[힙 영역(heap segment)]
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
- ‘더 이상 해당 메모리 공간을 사용하지 않겠다’라고 운영체제에 말해주는 것
- 메모리 누수(memory leak) : 메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비
- 동적 할당 영역
[스택 영역(stack segment)]
- 데이터를 일시적으로 저장하는 공간
- 데이터 영역에 담기는 값과는 달리 잠깐 쓰다가 말 값들이 저장되는 공간
- 함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수가 대표적인 데이터
- 동적 할당 영역
10-2. 프로세스 상태와 계층 구조
프로세스 상태
- 프로세스 상태 다이어그램(process state diagram)
프로세스 계층 구조
1. 사용자가 컴퓨터를 켠 순간에 생성된 최초 프로세스는 로그인을 담당하는 프로세스를 자식 프로세스로 생성
2. 로그인 프로세스는 사용자 인터페이스(bash 셸) 프로세스를 자식 프로세스로 생성
3. 사용자 인터페이스 프로세스는 Vim 프로세스를 생성
프로세스 생성 기법
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
- 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
[⭐혼공단 미션 인증!⭐]
[CH10]미션1. 304쪽 1번 풀기
Process states and transitions
프로세스는 요청에 따라 상태가 계속 전환된다.
new : 새롭게 생성된 process
ready : CPU에서의 실행을 기다리는 상태
running : 실행중인 process
waiting : I/O(사용자의 입출력)이나 scheduling에 의한 대기 상태
terminated : 실행을 마친 상태
(ready ≠ waiting), FCFS로 스케줄링 해줌
10-3. 스레드
- 실행의 단위
- 프로세스를 구성하는 실행의 흐름 단위
프로세스와 스레드
- CPU scheduling의 기본 단위 → Process 내부의 sub-task 단위로 일을 처리
→ (실제로 스레드 단위로 일을 처리, 훨씬 더 빠르고 효율적으로 일할 수 있다.)
- flow of control within a process(process와 subprocess로 이해할 수 있음)
- 각각의 thread는 각자의 register state와 stack을 가지고 있다.
- 하나의 process는 하나 이상의 thread를 가지고 있음
- process는 프로세스 간의 전환에 대하여 PCB에 접근해서 Process address space를 복사해오는 등의 과정 때문에 overhead가 클 수 밖에 없는데, thread는 Process에 비해 creation과 switching에 드는 시간이 적다는 장점이 있다.(Memory와 CPU 효율성 면에서 모두 장점을 가짐)
- multi-threading in single core (≠ multi-processing in multi-core)
- 하나의 process에 대해서 여러 thread가 만들어질 수 있고, 이 때 code와 address space, operating resources를 공유한다.
- multi-threading을 통해서 동시성을 추구한다.
- 병렬성(parallelism) : 여러 코어에서 동시에 process가 처리될 때 → multi-processing
- parallelism = num of CPUs(cores)
- 동시성(concurrency) : illusion of parallelism → (마치, CPU가 동시에 여러 일을 처리하는 것처럼 보임)
→ Hyper-threading (intel CPU, logical core) : 마치 OS가 느끼기에는 physical core의 개수가 2배가 있는 것처럼 느끼게 하는 기술 (두 팔을 열심히 흔들면 4개인 것처럼 보이는 것)
- (비유) 코어 = 노예, 스레드 = 노예의 팔