실행 중인 프로그램. 디스크에 있는 파일(프로그램)이 메모리에 올라와 CPU를 받는 상태가 되면 프로세스다.
메모리에 어떻게 잡히는가
OS는 프로세스마다 독립된 주소 공간을 준다. 그 안은 네 구역으로 나뉜다.
높은 주소
┌───────────────┐
│ 스택 │ 지역 변수, 함수 호출 정보 (아래로 자람)
├───────────────┤
│ ↓ │
│ ↑ │
├───────────────┤
│ 힙 │ 동적 할당(new, malloc) (위로 자람)
├───────────────┤
│ 데이터 │ 전역·정적 변수
├───────────────┤
│ 코드(text) │ 실행할 기계어 (읽기 전용)
└───────────────┘
낮은 주소
스택과 힙이 서로를 향해 자라는 이유는 남은 공간을 둘이 나눠 쓰기 위해서다. 둘이 만나면 스택 오버플로 또는 메모리 부족이 된다.
독립이라는 말의 의미
프로세스 A가 주소 0x1000에 쓴 값을 프로세스 B는 볼 수 없다. B의 0x1000은
완전히 다른 물리 메모리를 가리킨다. MMU가 가상 주소를 프로세스마다 다른
물리 주소로 변환해 주기 때문이다.
그래서 안전하지만, 서로 대화하려면 별도 수단(IPC) 이 필요하다 — 파이프, 소켓, 공유 메모리, 메시지 큐, 시그널.
PCB — OS가 프로세스를 기억하는 방법
OS는 프로세스마다 PCB(Process Control Block) 라는 구조체를 커널 영역에 둔다.
PCB
├── PID (프로세스 번호)
├── 상태 (준비/실행/대기)
├── 레지스터 값 (PC, SP 등) ← 컨텍스트 스위칭 때 저장·복원되는 것
├── 메모리 정보 (페이지 테이블 위치)
└── 열린 파일 목록
상태 전이
다이어그램 로딩 중…
면접 포인트
"프로세스를 여러 개 만들면 되지 왜 스레드를 쓰나?" → 프로세스 생성은 주소 공간을 통째로 만드는 무거운 작업이고, 서로 메모리를 못 봐서 통신 비용도 크다. 스레드는 주소 공간을 공유해 생성·전환·통신이 모두 싸다.