📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.
1. 프로세스 개요
1-1. 프로세스 직접 확인하기
포그라운드 프로세스
백그라운드 프로세스
- 보이지 않는 공간에서 실행되는 프로세스
- 데몬(daemon)
1-2. 프로세스 제어 블록
운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고,
프로세스에 CPU를 비롯한 자원을 배분한다.
프로세스 제어 블록(PCB: process control block)
- 해당 프로세스를 식별하기 위해 꼭 필요한 정보들을 저장
- 커널 영역에 생성된다.
- 프로세스 생성시 만들어지고, 실행이 끝나면 폐기됨
- PCB에 담기는 정보들
프로세스 ID(PID)
- 특정 프로세스를 식별하기 위해 부여하는 고유 번호
레지스터 값
- 해당 프로세스가 실행하며 사용했던 PC 등의 레지스터 값들 저장
프로세스 상태
CPU 스케줄링 정보
- 프로세스가 언제 어떤 순서로 CPU 할당받는지
메모리 관리 정보
- 프로세스가 메모리 어디에 저장되어 있는지 <페이지 테이블 정보>
사용한 파일과 입출력장치 목록
1-3. 문맥 교환(Context Switching)
문맥 교환(Context Switching)
- 프로세스 A → 프로세스 B 갈아끼우기
- 문맥이란 PCB 정보
- Switching 과정
- 기존 프로세스의 문맥을 PCB에 백업한다.
- 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구한다.
- BUT!! 문맥 교환을 너무 자주 하면 오버헤드 발생 가능
1-4. 프로세스의 메모리 영역
프로세스가 생성되면 커널 영역에 PCB 생성된다. 사용자 영역에는 무슨 일이 일어나는가?
코드 영역
- 기계어로 이루어진 명령어 저장
- read-only
- = 텍스트 영역
데이터 영역
- 프로그램이 실행되는 동안 유지되며, 프로그램 전체에서 접근할 수 있는 변수
- like 전역 변수
힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역은 무조건 반환해야 함
스택 영역
- 데이터를 일시적으로 저장하는 공간
- like 매개 변수, 지역 변수
정적 할당 영역
동적 할당 영역 : 실시간으로 크기 변경
2. 프로세스 상태와 계층 구조
2-1. 프로세스 상태
운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.
생성 상태(New)
- 프로세스를 생성 중
- 메모리에 적재되어 PCB 할당 받음
준비 상태(Ready)
실행 상태(Running)
대기 상태(Blocked)
종료 상태(Terminated)
- 프로세스 종료
- 운체가 PCB와 메모리 정리함
[프로세스 상태 다이어그램]

2-2. 프로세스 계층 구조
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
부모 프로세스
자식 프로세스
- 부모 프로세스에 의해 생성된 프로세스
- PPID(Parent PID) : 부모 프로세스의 PID
프로세스 계층 구조
최초의 프로세스로부터 자식을 계속 낳음 → 트리 구조
- 컴퓨터가 부팅될 때 실행되는 1번 PID 프로세스
2-3. 프로세스 생성 기법
- 복제
- 부모 프로세스는
fork
를 통해 자신의 복사본을 자식 프로세스로 생성한다.
- 옷 갈아입기
- 만들어진 복사본은
exec
을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
fork
- 자신의 복사본을 만드는 시스템 호출
- PID 값과 저장된 메모리 위치를 제외하고 모두 복사된다.
exec
- 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
- 코드와 데이터 영역의 내용이 실행할 프로그램 내용으로 바뀐다. 나머지는 초기화.
3. 스레드
스레드
- 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
- 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
프로세스
3-1. 프로세스와 스레드
단일 스레드 프로세스
스레드 등장..!
→ 같은 프로그램 내에서 각기 다른 코드를 실행할 수 있다.
→ 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행된다.
⇒ CPU가 처리할 작업을 전달할 때 스레드 단위로 전달함.
멀티 스레드 프로세스
- 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있다.
- 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있다.

스레드 간 공유하는 것
- 코드 영역 / 데이터 영역 / 힙 영역
- 열린 파일
- PCB
스레드 간 따로 쓰는 것
프로세스 간 따로 쓰는 것
- PCB
- 코드 영역 / 데이터 영역 / 힙 영역 / 스택 영역

3-2. 멀티 프로세스와 멀티 스레드
멀티 프로세스
- 여러 프로세스를 동시에 실행하는 것. core관점
멀티 스레드
- 여러 스레드로 프로세스를 동시에 실행하는 것. thread관점
멀티 스레드 vs 멀티 프로세스
→ 멀티 스레드 win
여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다.
- 스레드들은
- 프로세스들은
- 똑같은 것을 메모리에 턱턱 적재함
- 독립적으로 실행됨
프로세스 간 통신(IPC : Inter-process Communication)
프로세스는 유저공간 내에서 독립적으로 실행된다.
이처럼 독립적인 공간을 가진 프로세스 간 통신에 사용되는 기법이 IPC 통신이다.
프로세스는 커널이 제공하는 IPC 설비를 이용해 프로세스 간의 통신을 할 수 있게 된다.
- 메시지 전달(Message Passing)
- 커널을 통해 메시지를 전달하는 방식으로 자원이나 데이터를 주고 받음
- 커널을 이용하기 때문에 구현이 비교적 쉬움
- 시스템 콜이 필요하며 이로 인해 오버헤드 발생
- Pipe, Signal, Message Queueing, Socket 등
- 공유 메모리(shared memory)
- 프로세스들이 공유할 수 있는 메모리 영역을 두고 데이터를 주고 받을 수 있게 함
- 커널 의존도가 낮기 때문에 속도가 빠르고 통신이 자유로움
- 자원과 데이터를 공유하기 때문에 동기화 이슈 발생
- Shared Memory, Semaphore 등