운영체제

🧵 스레드(Thread)와 프로세스(Process)의 이해

잔잔한 흐름 2025. 4. 19. 15:56

 

운영체제를 공부하면서 빠질 수 없는 개념이 바로 **프로세스(Process)**와 **스레드(Thread)**입니다. 이 글에서는 두 개념의 차이점과 특징, 그리고 각각의 장단점까지 쉽게 정리해보겠습니다.

본 내용은 <혼자 공부하는 컴퓨터 구조 + 운영체제>를 바탕으로 만들어졌습니다.


🧠 스레드란?

**스레드(Thread)**는 하나의 프로세스 안에서 실행되는 작업의 흐름 단위입니다.

📌 정리하면,

  • 하나의 프로세스는 여러 스레드를 가질 수 있어요.
  • 스레드를 사용하면 하나의 프로그램 안에서 여러 작업을 동시에 처리할 수 있습니다.

💡 예를 들면?
웹 브라우저는 한쪽 탭에서는 유튜브를 재생하고, 다른 탭에서는 웹페이지를 읽을 수 있죠. 각각의 작업이 스레드로 동작하는 거예요.

 

*단일 프로세스: 실행의 흐름의 단위가 하나

*멀티스레드 프로세스: 하나의 프로세스가 한 번에 여러 일을 동시에 처리

 


🔄 프로세스와 스레드의 차이

 

항목 프로세스 스레드
정의 실행 중인 프로그램 프로세스 내 실행 단위
자원 공유 기본적으로 공유 ❌ 자원 공유 ⭕ (코드, 데이터 등)
독립성 독립적 상호 의존적
메모리 사용 많음 적음
오류 발생 시 영향 다른 프로세스에 영향 거의 없음 다른 스레드에도 영향 줄 수 있음

🌱 스레드의 구성 요소

스레드는 다음과 같은 요소로 구성되어 있어요:

  • 스레드 ID
  • 프로그램 카운터(PC)
  • 레지스터
  • 스택

이러한 구성 덕분에 스레드들은 같은 프로세스 안에서도 서로 다른 작업을 처리할 수 있습니다. 단, 자원(코드, 데이터, 힙)은 공유합니다.

 

여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 점이다. 프로세스의 자원을 공유한다는 것이 스레드의 핵심이다. 

위 그림의 예를 보면 스레드 1만의 코드/데이터/힙 영역이 있고, 스레드 2만의 코드/데이터/힙 영역이 있는 게 아니라는 의미이다.

 

▶ 정리하면, 프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 실제로 최근 많은 운영체제에서 cpu에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다. 그리고 스레드는 프로세스 자원을 공유한 채 실행에 필효한 최소한의 정보만을 실행한다.


🧩 리눅스에서의 관점

리눅스는 프로세스와 스레드를 명확하게 구분하지 않고, 모두 **테스크(Task)**로 통합해서 다룹니다.
이는 두 개념이 모두 **실행의 문맥(Context of Execution)**이라는 공통점을 가지기 때문입니다.

다음은 리눅스 운영체제 창시자 리누스 토르발스(Linus Torvalds)가 한 말이다.

 

 

프로세스와 스레드를 별개의 것으로 구분할 이유가 없다. 전통적으로는 그렇게 해왔지만, 개인적으로 그것은 역사적인 짐과도 같다고 생각한다.
프로세스와 스레드는 그냥 "실행의 문맥"일 뿐이다"



🧬 멀티프로세스 vs 멀티스레드

 

항목 멀티 프로세스 멀티 스레드
실행 단위 여러 프로세스 하나의 프로세스, 여러 스레드
자원 공유 거의 없음 대부분 공유
메모리 효율 낮음 높음
독립성 높음 낮음

📌 예를 들어, hello.os 프로그램을 실행한다고 가정할 때:

  • 멀티프로세스는 동일한 코드가 메모리에 여러 번 복사됨 ➡️ 메모리 낭비
  • 멀티스레드는 자원을 공유하므로 메모리 효율이 높음

큰 차이가 있는 부분이 프로세스끼리는 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내 자원을 공유한다.

 

* 프로세스를 fork하여 같은 작업을 하는 동일한 프로세스 2개를 동시에 실행하면 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제되어 메모리에 적재

=> 이는 시간 낭비(메모리에 동일한 내용들이 중복해서 존재)

 

* 쓰기 시 복사(copy on write) 기법 : fork한 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법이 있다.

 

이에 반해 스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지고 있는 자원을 공유한다.

위의 그림처럼 같은 프로세스 내 모든 스레드는 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유한다. 여러 프로세스를 병렬 실행하는 것보다 메모리를 더 효율적으로 사용가능하다. (협력과 통신에도 유리!)

 

※단점: 멀티프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만, 멀티스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.

모든 스레드는 프로세스의 자원을 공유하고, 하나의 스레드에 문제가 생기면 다른 스레드도 영향을 받기 때문이다.


📡 프로세스 간 통신 (IPC)

서로 다른 프로세스끼리도 데이터를 주고받을 수 있어요. 이를 **IPC (Inter-Process Communication)**라고 부릅니다.

🔗 대표적인 방법들:

  • 파일 공유: 하나의 파일을 읽고 쓰는 방식
  • 공유 메모리(shared memory): 메모리 영역을 나눠 쓰는 방식
  • 소켓/파이프: 프로세스 간의 직접 통신


🧠 마무리 요약

프로세스는 프로그램 실행의 단위
스레드는 프로세스를 구성하는 실행 흐름
스레드는 자원을 공유, 메모리 효율이 좋지만 오류 전파에 주의
✅ 리눅스는 프로세스/스레드를 Task로 통합해서 처리
✅ 멀티스레드는 협업에 유리하지만 위험도 함께 존재
✅ 프로세스 간에도 통신(IPC)이 가능하다!