[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