"프로그램이 실행될 때, 내부에서는 어떤 일이 벌어질까?"
코드를 실행하면 프로그램이 "돌아간다"고 쉽게 표현하지만,
사실 그 내부에는 프로세스와 스레드라는 구조가 정교하게 움직이고 있습니다.
이 글에서는
- 프로세스와 스레드의 개념
- 차이점
- 실제 컴퓨터에서 어떻게 사용되는지
- 개발할 때 어떤 점을 신경 써야 하는지
를 하나하나 차근차근 깊게 설명하겠습니다.
프로세스(Process)란 무엇인가?
프로세스(Process)는
실행 중인 프로그램(program)을 의미합니다.
- 하나의 프로그램이 메모리에 올라가서 운영체제(OS)로부터 독립된 자원(메모리, CPU 시간 등)을 할당받고, 실행되는 단위입니다.
- 각 프로세스는 고유한 메모리 공간(코드, 데이터, 스택, 힙 등)을 갖습니다.
예시:
- 메모장에서
.txt
파일을 열면 하나의 프로세스가 생성됩니다. - 크롬 브라우저를 켜면 탭마다 각각 다른 프로세스가 뜰 수도 있습니다.
프로세스의 특징 요약
항목 | 설명 |
독립성 | 다른 프로세스와 메모리 공간을 공유하지 않음 |
메모리 구조 | 코드 영역, 데이터 영역, 스택 영역, 힙 영역 등 분리 |
생성 비용 | 새 프로세스를 만들려면 자원을 많이 소비함 |
통신 방법 | 프로세스 간 통신(IPC, Inter Process Communication)이 필요 |
스레드(Thread)란 무엇인가?
스레드(Thread)는
프로세스 내부에서 실제 작업을 수행하는 흐름(최소 실행 단위)입니다.
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
- 스레드는 코드, 데이터, 힙 메모리를 공유하고,
자신의 스택(stack)만 별도로 가집니다.
예시:
- 메모장에서 글을 작성하는 동안, 동시에 맞춤법 검사 기능이 작동하는 경우
→ 메모장 프로세스 안에 글 작성 스레드, 검사 스레드가 따로 존재
스레드의 특징 요약
항목 | 설명 |
경량성 | 프로세스보다 훨씬 가볍게 생성, 제거 가능 |
메모리 공유 | 프로세스 내부 자원을 공유함 |
독립성 부족 | 하나의 스레드 오류로 전체 프로세스가 영향을 받을 수 있음 |
프로세스 vs 스레드: 차이점
비교 항목 | 프로세스 | 스레드 |
정의 | 실행 중인 프로그램 | 프로세스 내 작업 단위 |
메모리 공유 | X (완전히 분리) | O (코드, 데이터, 힙 공유) |
생성 비용 | 크다 | 작다 |
통신 방법 | IPC(복잡함) | 메모리 공유(간단함) |
안정성 | 하나 죽어도 다른 프로세스 영향 없음 | 하나 죽으면 전체 프로세스 죽을 수 있음 |
프로세스와 스레드의 관계
- 프로그램을 실행 → 운영체제가 프로세스를 생성합니다.
- 프로세스는 기본적으로 하나 이상의 스레드를 가지고 시작합니다. (보통 1개)
- 추가 작업이 필요하면 프로세스 안에서 새로운 스레드를 만들어 병렬로 작업을 진행합니다.
구조:
프로그램 → 프로세스(메모리 공간) → 스레드1, 스레드2, 스레드3
멀티프로세스, 멀티스레드
멀티프로세스(Multi-Process)
- 여러 프로세스를 동시에 실행하는 방식.
- 각 프로세스가 독립적이므로 충돌이 적지만, 메모리 사용량이 많음.
예시:
- 크롬 브라우저: 탭마다 다른 프로세스 (한 탭이 죽어도 다른 탭은 살아있음)
멀티스레드(Multi-Thread)
- 하나의 프로세스 안에서 여러 스레드를 동시에 실행하는 방식.
- 메모리를 공유해서 가볍고 빠르지만, 공유자원 문제(동기화 문제)가 생길 수 있음.
예시:
- 게임 프로그램: 렌더링, 네트워크 통신, 입력 처리 등이 각각 스레드로 동작
예시와 실전 활용
상황 | 선택 전략 |
안정성이 중요하다 | 멀티프로세스 선호 (크롬 브라우저, 서버 다중 인스턴스) |
성능이 중요하다 | 멀티스레드 선호 (게임, 실시간 처리) |
병렬 데이터 처리 | 멀티스레드로 데이터 병렬 처리 |
높은 메모리 소모 감당 가능 | 멀티프로세스 사용 |
프로세스/스레드 사용 시 주의할 점
- 스레드 동기화 문제
스레드는 자원을 공유하기 때문에, 서로 충돌을 방지하기 위해 락(Lock), 세마포어(Semaphore) 등을 사용해야 합니다. - 프로세스 간 통신(IPC) 복잡성
프로세스는 메모리를 공유하지 않기 때문에 소켓, 파이프, 메시지 큐 같은 방법으로 통신해야 합니다. - 오버헤드(Overhead) 고려
멀티프로세스를 쓰면 메모리, 컨텍스트 스위칭 비용이 커질 수 있습니다. - 죽음 전파 위험성
스레드 하나가 죽으면 전체 프로세스가 죽을 수 있으므로 예외처리나 안전장치를 마련해야 합니다.
마무리 요약
구분 | 프로세스 | 스레드 |
정의 | 실행 중인 프로그램 | 프로세스 내 작업 흐름 |
독립성 | 강함 | 약함 |
메모리 구조 | 완전 분리 | 코드, 데이터, 힙 공유 |
생성/관리 비용 | 높음 | 낮음 |
주의사항 | IPC 복잡성 | 동기화 이슈 |
프로세스/스레드 관련 주요 용어 정리
용어 | 설명 |
Context Switching | CPU가 작업 중인 스레드/프로세스를 다른 것으로 전환하는 과정 |
Deadlock(교착 상태) | 둘 이상의 스레드가 서로의 자원을 기다리다가 영원히 멈추는 현상 |
Race Condition | 여러 스레드가 동시에 공유 자원에 접근해서 순서가 엉키는 문제 |
마치며
프로세스와 스레드는 운영체제, 서버 프로그래밍, 게임, 브라우저, 앱 모든 분야의 핵심입니다.
단순히 "프로세스는 무겁고 스레드는 가볍다" 수준을 넘어,
메모리 구조, 통신 방식, 동기화 문제까지 깊이 이해하고 있어야
실제 개발에서도 오류 없이 견고한 시스템을 만들 수 있습니다.
728x90