[Operating Systems] 프로세스와 스레드의 개념과 차이점
프로세스와 스레드가 무엇인지, 그리고 둘의 차이점을 알아보고자 한다.
🔄 프로세스와 스레드
프로세스는 컴퓨터에서 실행되고 있는 프로그램 하나를 의미한다. 각각 독립적인 메모리 공간을 가지고 있어서 다른 프로세스와 직접적으로 데이터를 주고받을 수 없다.
스레드는 프로세스 안에서 실제로 일을 하는 작업 단위이다. 같은 프로세스 내의 스레드들은 메모리 공간을 공유하기 때문에 서로 데이터를 쉽게 주고받을 수 있다.
쉽게 비유하면 프로세스는 회사이고, 스레드는 그 회사에서 일하는 직원들이라고 할 수 있다. 회사(프로세스)마다 독립적인 사무실(메모리)을 가지고 있지만, 같은 회사 직원들(스레드)은 사무실을 공유해서 사용한다.
// 프로세스 생성
const { spawn } = require("child_process");
const child = spawn("node", ["worker.js"]);
// 스레드 생성
const { Worker } = require("worker_threads");
const worker = new Worker("./worker.js");
🏠 프로세스와 스레드의 메모리 구조
🏢 프로세스의 메모리 구조
프로세스의 메모리 구조는 완전히 독립적이고 분리되어 있다.
각 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역을 각자 따로 가지고 있다. 따라서 한 프로세스가 다른 프로세스의 메모리에 직접 접근할 수 없다.
- 코드 영역: 실행할 프로그램 코드가 저장되는 공간
- 데이터 영역: 전역 변수와 정적 변수가 저장되는 공간
- 힙 영역: 동적으로 할당되는 메모리 공간
- 스택 영역: 함수 호출과 지역 변수가 저장되는 공간
👥 스레드의 메모리 구조
스레드의 메모리 구조는 일부를 공유한다.
같은 프로세스 내의 스레드들은 코드, 데이터, 힙 영역은 공유하지만, 스택 영역은 각자 독립적으로 가진다. 이는 각 스레드가 독립적인 함수 호출과 지역 변수를 관리할 수 있게 해준다.
- 공유 영역: 코드, 데이터, 힙 → 모든 스레드가 함께 사용
- 독립 영역: 스택 → 각 스레드마다 별도로 존재
⚖️ 프로세스 vs 스레드 비교
두 방식은 각각 다른 특성과 장단점을 가지고 있다.
구분 | 프로세스 | 스레드 |
---|---|---|
메모리 공간 | 독립적 | 공유 (스택 제외) |
생성 비용 | 높음 | 낮음 |
통신 방법 | IPC 필요 | 메모리 공유 |
안정성 | 높음 (격리됨) | 낮음 (영향 받음) |
컨텍스트 스위칭 | 느림 | 빠름 |
🛡️ 안정성 측면
프로세스는 각각 독립된 메모리 공간을 가지므로 한 프로세스에서 오류가 발생해도 다른 프로세스에는 영향을 주지 않는다.
스레드는 메모리를 공유하므로 한 스레드에서 잘못된 메모리 접근이 발생하면 전체 프로세스가 영향을 받을 수 있다.
⚡ 성능 측면
프로세스는 생성과 전환에 많은 비용이 들지만, 독립성으로 인해 안정적이다.
스레드는 생성과 전환이 빠르고 메모리를 효율적으로 사용하지만, 동기화 문제를 신경써야 한다.
🔄 컨텍스트 스위칭
컨텍스트 스위칭은 CPU가 현재 실행 중인 작업을 멈추고 다른 작업으로 전환하는 과정이다.
📋 프로세스 컨텍스트 스위칭
프로세스 간 컨텍스트 스위칭은 비용이 크다.
메모리 맵을 완전히 바꿔야 하고, 캐시 메모리도 무효화되어야 한다. 따라서 상대적으로 오래 걸린다.
⚡ 스레드 컨텍스트 스위칭
스레드 간 컨텍스트 스위칭은 상대적으로 빠르다.
같은 프로세스 내에서 일어나므로 메모리 맵을 바꿀 필요가 없고, 레지스터와 스택 정보만 교체하면 된다.
🎯 멀티프로세싱 vs 멀티스레딩
🏭 멀티프로세싱
멀티프로세싱은 여러 개의 프로세스를 동시에 실행하는 방식이다.
각 프로세스가 독립적이므로 안정성이 높지만, 메모리 사용량이 많고 통신 비용이 크다. 웹 브라우저가 탭마다 별도 프로세스를 만드는 것이 대표적인 예이다.
장점:
- 각 프로세스가 독립적으로 실행되어 안정성이 높다.
- 프로세스마다 별도의 메모리 공간을 사용해 서로 영향을 주지 않는다.
- 문제 발생 시 해당 프로세스만 디버깅하면 되어 상대적으로 쉽다.
단점:
- 프로세스별로 메모리를 많이 사용한다.
- 프로세스 간 통신 속도가 느리다.
- 새로운 프로세스를 생성하는 비용이 크다.
🧵 멀티스레딩
멀티스레딩은 하나의 프로세스 안에서 여러 스레드를 동시에 실행하는 방식이다.
메모리를 공유하므로 효율적이지만, 한 스레드에서 문제가 발생하면 전체 프로세스에 영향을 줄 수 있다. 게임에서 그래픽 렌더링, 사운드 처리, 게임 로직을 각각 다른 스레드로 처리하는 것이 예시이다.
장점:
- 같은 메모리를 공유해 메모리 사용이 효율적이다.
- 스레드 간 통신이 빠르다.
- 스레드 생성 비용이 적고 빠르다.
단점:
- 여러 스레드가 동시에 자원에 접근해 동기화 문제가 발생할 수 있다.
- 한 스레드 오류가 전체 프로세스에 영향을 준다.
- 디버깅이 복잡하고 어렵다.
안전함이 중요한 곳에서는 프로세스를 써서 서로 방해받지 않게 하고, 빠른 속도가 중요한 곳에서는 스레드를 써서 프로세스와 스레드를 상황에 맞게 골라서 쓴다고 한다.
이 두 개념을 제대로 알고 잘 활용하면 더 좋은 프로그램을 만들 수 있을 것이다.
Leave a comment