운영체제를 공부하면 가장 먼저, 그리고 시험에도 단골로 나오는 비교가 프로세스와 스레드다. 둘 다 “실행의 단위”지만, 무엇을 공유하고 무엇을 따로 갖는지가 다르다. 그 차이를 정리한다.
프로세스란
프로세스는 실행 중인 프로그램이다. 운영체제가 프로그램을 메모리에 올려 실행하면, 그 인스턴스 하나가 프로세스가 된다. 각 프로세스는 자신만의 독립된 자원을 갖는다.
- 독립된 메모리 공간(코드·데이터·힙·스택)
- 프로세스 제어 블록(PCB)에 상태·레지스터 등 정보 저장
- 다른 프로세스의 메모리에는 함부로 접근하지 못함(격리)
격리 덕분에 한 프로세스가 죽어도 다른 프로세스는 안전하다. 대신 프로세스끼리 데이터를 주고받으려면 IPC(프로세스 간 통신)라는 별도 장치가 필요하다.
스레드란
스레드는 프로세스 안에서의 실행 흐름이다. 한 프로세스는 여러 스레드를 가질 수 있고, 이들은 프로세스의 자원을 공유한다.
- 코드·데이터·힙을 공유한다
- 단, 스택과 레지스터(실행 위치)는 스레드마다 따로 갖는다
공유하기 때문에 스레드 간 통신은 빠르고 쉽다. 같은 메모리를 보기 때문이다. 대신 한 스레드가 공유 데이터를 잘못 건드리면 프로세스 전체가 영향을 받는다. 그래서 동기화(락 등)가 필요해진다.
왜 나눠 쓰나 — 웹 서버 예시
웹 서버를 떠올리면 감이 온다. 요청이 들어올 때마다 프로세스를 새로 띄우면 메모리를 통째로 복제하고 격리하느라 무겁다. 대신 하나의 서버 프로세스 안에서 요청마다 스레드를 하나씩 배정하면, 코드와 설정 같은 공유 자원은 그대로 쓰면서 실행 흐름만 여러 개로 늘릴 수 있다. 생성 비용이 작고 자원을 공유하니 응답이 빠르다.
물론 공짜는 아니다. 여러 스레드가 같은 데이터(예: 접속자 수 카운터)를 동시에 고치면 값이 꼬이는 경쟁 상태(race condition)가 생긴다. 그래서 멀티스레드에는 락·세마포어 같은 동기화가 따라붙는다. “빠르고 가볍다”와 “동기화가 필요하다”는 언제나 한 세트로 움직인다.
핵심 비교
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 메모리 | 독립 | 공유(스택만 개별) |
| 통신 | IPC 필요, 느림 | 공유 메모리, 빠름 |
| 안정성 | 하나 죽어도 격리됨 | 하나 문제 → 프로세스 전체 위험 |
| 생성 비용 | 큼 | 작음 |
시험 포인트
- 스레드가 공유하는 것(코드·데이터·힙)과 따로 갖는 것(스택·레지스터·PC)을 구분하는 문제가 자주 나온다.
- “경량 프로세스(LWP)“라는 표현은 스레드를 가리킨다.
- 멀티스레드의 장점(응답성·자원 공유·경제성)과 단점(동기화 문제)을 함께 기억한다.
이 글에 대한 의견은 아래 댓글로 남겨주세요 (GitHub 계정 필요). 로그인 없이 남기고 싶다면