목차
운영체제와 프로그래밍을 공부하다 보면 스레드(Thread)와 프로세스(Process)라는 용어를 자주 마주칩니다. 이 둘은 프로그램 실행의 핵심 단위지만, 역할과 동작 방식에서 뚜렷한 차이를 보입니다. 이 글에서는 스레드와 프로세스의 주요 개념, 특징, 차이점, 원리, 그리고 주의사항까지 초보자도 쉽게 이해할 수 있도록 상세히 설명합니다. 멀티태스킹과 성능 최적화에 관심이 있다면, 지금 바로 읽어보세요!
1. 스레드(Thread)와 프로세스(Process)의 주요 개념 및 특징
1.1 프로세스(Process)란?
프로세스는 운영체제에서 실행 중인 프로그램을 의미합니다. 즉, CPU와 메모리를 할당받아 독립적으로 동작하는 실행 단위입니다. 독립적인 메모리 공간(Heap, Stack, Code 등)을 갖는 단위
주요 용어:
- PCB(Process Control Block): 프로세스 상태, ID, 메모리 정보 등을 저장
- 메모리 영역: 코드, 데이터, 힙, 스택으로 나뉨
- 상태: 생성, 준비, 실행, 대기, 종료
특징:
- 하나의 프로세스는 최소 1개의 스레드를 포함
- 독립적인 메모리 공간을 가짐
- 서로 다른 프로세스는 메모리 공유 ❌ 프로세스 간 통신(IPC, Inter-Process Communication)이 필요
- 자원 소모가 큼(메모리, CPU 등)
- 운영체제에 의해 관리됨 ( 운영체제에서 자원을 할당받는 단위 )
예: 메모장에서 파일을 여는 행위 = 새로운 프로세스 실행
1.2 스레드(Thread)란?
스레드는 프로세스 내에서 실행되는 작업 단위로, 프로세스의 자원을 공유하며 동작합니다. "경량 프로세스(Lightweight Process)"라고도 불립니다.
주요 용어:
- 스레드 ID: 스레드를 식별하는 고유 값
- 스택: 각 스레드마다 독립적인 호출 스택을 가짐
- 공유 자원: 코드, 데이터, 힙은 스레드 간 공유
특징:
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
- 동일한 프로세스 내에서 자원( 메모리(Heap) 등)을 공유
- 빠른 생성과 컨텍스트 스위칭
- 멀티스레딩으로 병렬 작업 가능
- 스레드 간 동기화 필요
- CPU 사용 측면에서 효율적, 응답성 향상
예: 웹 브라우저에서 탭을 여럿 띄우면 각각 스레드로 처리 가능
1.3 스레드와 프로세스의 차이점
구분 | 프로세스 | 스레드 |
정의 | 실행 중인 프로그램 | 프로세스 내 실행 단위 |
자원 | 독립적인 메모리 공간 | 프로세스의 자원을 공유 |
생성 비용 | 높음 (메모리 할당 등 필요) | 낮음 (스택만 생성) |
통신 | IPC 필요 (파이프, 소켓 등) | 메모리 공유로 직접 통신 가능 |
예시 | 브라우저, 워드프로세서 | 브라우저 탭, 파일 다운로드 |
2. 스레드와 프로세스의 원리 및 구조
2.1 프로세스의 구조와 동작 원리
프로세스는 운영체제로부터 독립적인 메모리 공간을 할당받습니다. 이 메모리는 네 가지 주요 영역으로 나뉩니다:
- 코드 영역: 실행할 프로그램 코드
- 데이터 영역: 전역 변수, 정적 변수
- 힙 영역: 동적 메모리 할당
- 스택 영역: 함수 호출 및 지역 변수
예시 1 :
사용자가 워드와 크롬을 동시에 실행
→ 워드 = 하나의 프로세스
→ 크롬 = 또 다른 프로세스
→ 서로의 메모리에 접근할 수 없음
예시 2: 프로세스 실행 흐름 운영체제가 프로그램을 실행하면, 프로세스가 생성되고 PCB에 상태가 기록됩니다. 예를 들어, 웹 브라우저를 실행하면 하나의 프로세스가 생성되고, CPU 스케줄링에 따라 실행됩니다.
public class ProcessExample {
public static void main(String[] args) {
System.out.println("Process ID: " + ProcessHandle.current().pid());
// 독립적인 프로세스로 실행됨
}
}
동작 원리:
- 운영체제가 프로세스를 생성하고 메모리를 할당.
- CPU가 프로세스를 실행하며 상태를 관리(준비 → 실행 → 종료).
- 다른 프로세스와 독립적으로 동작하며, 통신은 IPC를 통해 이루어짐.
2.2 스레드의 구조와 동작 원리
스레드는 프로세스 내에서 실행되며, 코드, 데이터, 힙은 공유하지만 각 스레드는 독립적인 스택을 가집니다. 이를 통해 병렬 작업이 가능해집니다.
Java로 구현한 멀티스레드 예시:
public class ThreadExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 1: " + i);
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 2: " + i);
}
});
thread1.start();
thread2.start();
}
}
동작 원리:
- 프로세스 내에서 스레드가 생성되고, 공유 자원을 활용.
- 각 스레드는 독립적인 스택으로 호출 흐름을 관리.
- 스레드 간 자원 공유로 빠른 통신 가능, 하지만 동기화(Synchronized) 필요.
예시 1: 웹 브라우저에서 HTML 렌더링(스레드 1)과 파일 다운로드(스레드 2)가 동시에 실행되며, 동일한 프로세스의 메모리를 공유합니다.
예시 2:
크롬에서 여러 탭을 열어 유튜브, 구글, 메일을 동시에 실행
→ 하나의 크롬 프로세스 내부에서 각각 스레드로 동작
→ 리소스 공유 + 병렬 실행 가능
3. 주의사항: 스레드와 프로세스의 장점과 단점
3.1 프로세스의 장점과 단점
장점:
- 독립적인 메모리로 안정성 높음(하나가 종료돼도 다른 프로세스에 영향 없음)
- 보안성 우수(프로세스 간 데이터 접근 제한)
- 멀티태스킹 환경에서 적합
단점:
- 생성 및 종료 비용이 큼(메모리 할당/해제)
- 프로세스 간 통신(IPC)이 복잡하고 느림
- 자원 소모가 많음
주의사항:
- 메모리 부족 시 프로세스 생성에 실패할 수 있으니 자원 사용량을 모니터링하세요.
- IPC 설계 시 성능 병목을 방지하려면 효율적인 통신 방법을 선택해야 합니다.
- 프로세스는 리소스가 무거워 너무 많이 생성하면 오버헤드 증가
3.2 스레드의 장점과 단점
장점:
- 자원 공유로 생성 및 컨텍스트 스위칭이 빠름
- 병렬 처리로 CPU 활용도 향상
- 동일 프로세스 내에서 데이터 접근이 쉬움
단점:
- 동기화 문제 발생 가능(데드락, 경쟁 조건)
- 하나의 스레드 오류가 전체 프로세스에 영향을 줄 수 있음
- 디버깅과 관리가 복잡
주의사항:
- 멀티스레딩 사용 시 synchronized 블록이나 Lock을 활용해 동기화를 관리하세요.
- 스레드 풀(Thread Pool)을 사용해 스레드 생성 오버헤드를 줄이는 것이 좋습니다.
- 스레드는 메모리를 공유하므로 공유 자원 접근 시 동기화 필요 (synchronized, ReentrantLock)
항목 | 프로세스 | 스레드 |
메모리 분리 | ✅ 완전 분리 | ❌ 공유 |
통신 속도 | 느림 (IPC 필요) | 빠름 (공유 메모리) |
오류 영향 | 다른 프로세스에 영향 없음 | 한 스레드 오류 시 전체 프로세스 위험 |
생성 비용 | 높음 (무거움) | 낮음 (가벼움) |
동기화 문제 | 거의 없음 | 주의 필요 (Race Condition 등) |
사용 용도 | 독립적인 작업 | 동시성 작업, 병렬 처리 |
4. 결론
프로세스와 스레드는 프로그램 실행의 기본 단위로, 각각의 특성에 따라 적합한 상황이 다릅니다. 프로세스는 독립성과 안정성이 필요한 경우(예: 서로 다른 애플리케이션 실행)에 적합하며, 스레드는 자원 효율성과 병렬 처리가 중요한 경우(예: 단일 애플리케이션 내 작업 분할)에 유리합니다. 운영체제와 프로그래밍 환경에서 이 둘의 차이를 이해하고, 프로젝트 요구사항에 맞게 활용하면 성능과 안정성을 모두 잡을 수 있습니다. 실무와 학습에서 이 개념을 적용해 보고, 멀티태스킹의 세계를 탐험해 보세요!
자바, Spring, Android 등에서 스레드 활용은 거의 필수 수준입니다.
예를 들어, Spring에서는 @Async를 통해 비동기 스레드를 쉽게 실행할 수 있습니다.
'이직&취업 > Java 기초 상식' 카테고리의 다른 글
Java 멀티스레드의 핵심, synchronized 이해하기! (19) | 2025.04.16 |
---|---|
volatile 키워드의 역할과 사용법 (29) | 2025.04.15 |
HashMap과 TreeMap 완벽 분석 (20) | 2025.04.13 |
스택 (Stack)과 큐 (Queue)에 대해 알아보자! (22) | 2025.04.12 |
REST API란 무엇이고 어떻게 만드나요? (24) | 2025.04.09 |