본문 바로가기
운영체제(OS)

[OS] Process / Thread

by 도전하는 린치핀 2023. 12. 29.

Process와 Thread

모두 프로그램의 실행과 관련된 단어들이다. 

 

프로세스와 스레드의 차이점을 결론부터 말하자면

Process는 실행의 단위, Thread는 Process 내에서 실행되는 흐름의 단위로 Process는 독립적으로 실행되지만 Thread는 Process 내의 Thread들 끼리는 Heap, Data 등(Stack은 개별 할당)을 공유한다.

 

그렇다면 프로세스와 스레드 모두 프로그램의 실행과 관련된 단어라면 프로그램과 프로세스의 차이점은 무엇일까?

 

간단하게 설명하면 프로그램은 아직 실행되지 않은 파일 그 자체로 쉽게 말해 코드 덩어리라고 보면 될 것 같다.

반대로 프로세스는 프로그램을 실행하였을 때 해당 파일이 컴퓨터 메모리에 올라가게 되고 동적인 상태의 프로그램이다.

간단하게 요약하자면 음식집에 가서 음식을 시키면(프로그램을 실행한다고 생각) 음식을 만드는 레서피(프로그램)을 통해 우리에게는 주문한 음식(프로세스)이 나올 것이다.

 

그렇다면 프로세스와 스레드를 하나씩 특징을 살펴보면서 더 자세히 알아보자


 

1. 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위

이미지 출처 : Heee's Development Blog

  • 하나의 프로그램이 실행되면 프로세스가 실행된다
  • 프로세스와 프로세스는 서로 완전히 독립되어 있다.
  • 프로세스는 문맥(context)라고 하는 코드, 데이터, 열린 파일 식별자, 동적 할당 영역, 스택 등을 모두 포함한다.
  • 따라서 프로세스간 문맥 교환(context-switching) 할 때 많은 비용이 든다.

2. 스레드 : 프로세스가 할당받은 자원을 이용하는 실행의 흐름 단위

  • 스레드는 레지스터와 자신의 스택만 독립적으로 가진다
  • 대부분의 문맥은 프로세스 안에서 스레드끼리 공유한다. -> 문맥 교환 비용이 낮아 프로그래밍에서 많이 사용된다.
  • 여러개의 스레드 구성 시 코드가 복잡해진다.

 

하나의 예시를 들어서 쉽게 이해해보면 우리가 보통 코딩을 한다고 생각해보자

그때 우리는 vsCode, 노래를 듣기 위한 유튜브, 아무 연락도 오지 않는 카카오톡, 모르는 부분들을 검색하기 위한 크롬 등을 실행시켜 놓고 작업을 진행할 것이다. 이때 vsCode, 유튜브 등 하나씩이 각각의 프로세스라고 생각하면 된다.

또한, 스레드의 경우 우리가 어떤 게임을 할 때 게임이라는 하나의 프로세스 내에서 게임 내 채팅, 게임 플레이 등 다양한 스레드가 서로 같은 자원을 공유하면서 프로세스가 실행될 것이다. 

 

또 다른 프로세스와 스레드의 차이점을 생각해보자

프로세스의 경우 실행되고 있는 프로세스에서 오류가 발생하여 강제 종료된다면 다른 프로세스에는 어떤 영향도 주지 못한다.

하지만 스레드는 하나의 프로세스 내에서 공유 자원을 사용하기 때문에 프로세스 내 하나의 스레드에서 오류가 발생하여 스레드가 강제 종료된다면 같은 프로세스 내 모든 스레드가 강제 종료될 수 있다.

 

 

결론적으로 프로그램, 프로세스, 스레드에 관한 정리는 아래와 같다.

  • 프로그램은 코드 덩어리로 프로그램을 실행했을 때 우리가 사용하는 것들은 프로세스다.
  • 원래 한 프로세스가 실행되기 위해 CPU를 점유하고 있으면 다른 프로세스는 실행 상태에 있을 수가 없다.
  • 다수의 프로세스를 동시에 실행하기 위해 여러개 프로세스를 시분할 즉 짧은 텀으로 전환해서 실행하게 한다. 이게 문맥교환(context-switching)이다.
  • 하나의 프로세스에는 하나 이상의 스레드가 존재한다.
  • 이러한 문맥 교환이 많아지는 것은 귀찮고 비용이 많이 드는 과정이기 때문에 경량화된 프로세스 버전인 스레드이다.
  • 왜 스레드가 경량화된 스레드인가 -> 하나의 프로세스 안에 다수의 스레드가 있을 때 공유되는 자원이 있기 때문이다. 스레드는 코드, 데이터, 힙 영역을 공통된 자원으로 사용한다.
  • 각 스레드는 스택 부분만을 따로 가지고 있는 것이다. 공유되는 자원이 있기 때문에 콘텍스트 스위칭이 일어날 때 캐싱 적중률이 올라가게 된다.
  • 프로세스의 경우 하나의 프로세스가 오류가 발생하여 프로세스가 강제 종료된다면 다른 프로세스에게 어떤 영향도 주지 않는다
  • 스레드의 경우 메모리 영역의 내용을 공유하기 때문에 어떤 스레드에서 오류가 발생하여 강제 종료된다면 같은 프로세스 내 다른 모든 스레드도 강제 종료된다.