프로세스와 스레드(process, thread)에 대해 알아보자.

2022.10.04 - [CS 기초 지식/[운영체제]] - 멀티 프로세스와 멀티 스레드란 ?

Process ( 프로세스 )

“프로그램 ( 어떤 작업을 위해 실행할 수 있는 파일 .exe )메모리에 올라와 운영체제로 부터 CPU를 할당받고 프로그램이 연속적으로 실행되고있는 상태.” ( 일을 처리하는 일련의 과정 )

 

음식을 예로 우리가 치킨을 먹기 위해 BBQ 치킨에 갔다고 가정해봅시다.

BBQ에가서 치킨을 주문시키면 BBQ의 레시피를  주는 것이아니라 BBQ만의 특별한 레시피를 가지고 치킨을 만들어 주겠죠 ? 

여기서 레시피 코드 파일 ( 프로그램 )이고, 치킨은 프로그램이 실행 되어 우리가 사용할 수 있는 프로세스 입니다.

레시피를 통해 치킨을 만드는 것처럼, 코드 파일( 프로그램 )을 실행 시켜  "프로세스"가 되어 우리가 사용할 수 있게 되는 것 입니다.

 

프로세스의 특징
  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다. 즉, 프로세스를 생성하면 반드시 하나 이상의  스레드가 생긴다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 프로세스끼리 자원을 공유 X
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신( IPC, inter-process communication )을 사용해야 한다.  Ex ) 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.

 

프로그램이 프로세스되면서 일어나는 일

1️⃣ 프로세스가 필요하는 재료들이 메모리에 올라가게 됩니다.

그 재료들은 4가지로 구성되어 있고, 메모리 공간을 확합니다.

Code 실행 명령을 포함하는 코드들
Data Static 변수 또는 Global 변수
Heap 동적 메모리 여역
Stack 지역변수, 매개변수, 반환 값 등등 일시적인 데이터

 

2️⃣ 그리고 해당 프로세스에 대한 정보를 가지고 있는 PCB 블록이 만들어집니다.

 

프로세스는 어떻게 실행되는가?

우리가 코딩 공부를 할때를 봅시다.

여기서는 카카오톡, 유투브, 구글 크롬, VScode 프로그램들을 사용해, 총 4개의 프로세스를 사용하고 있습니다.

이처럼 보통 컴퓨터로 어떤일을 할 대 우리는 하나의 프로세스만 이용하는게 아니라 여러 프로세스를 이용합니다.

하지만 원래 한 프로세스가 CPU를 다 점유하고 있다면 다른 프로세스는 실행할 수 없습니다.

그렇기 때문에 다수의 프로세스를 동시 실행하기 위해 여러 개의 프로세스를 짧은 텀을 반복하며 전환해서 실행 시키도록 합니다. 이러한 과정을 바로 "Context Switching" 이라고 합니다.

 

Context Switching

CPU에서 여러 프로세스를 짧은 텀으로 돌아가며 작업을 처리하는 과정으로,

동작중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고 대기 하고 있다가 다시 실행시켜 복구하는 비용(시간) 입니다.

즉, PCB-1 과 PCB-2가 서로 대기와 준비를 번갈아가며 하는 것 입니다.

 

다음 그림을 통해 Context Switching 과정에 대해 알아봅시다.

  1. PCB-1 을 실행시키면 PCB-1은 CPU에 올라가게 되고 PCB-2 는 준비단계에서 기다립니다.
  2. PCB-2 를 실행시키면 PCB-2는 CPU에 올라가게 됩니다. PCB-1은 준비 단계로 돌아가게 됩니다.
  3. 다시 PCB-1 을 실행시키면 PCB-1은 CPU에 올라갑니다. PCB-2은 다시 준비단계로 돌아가게 됩니다.

이 그림에서는 프로세스 수가 많지 않아 크게 와닿지 않을 수 있지만

작업관리자로 우리가  사용하는 프로세스만 봐도 정말 많은 것을 볼 수 있습니다.

 

이 많은 프로세스에서 Context Switching이 일어나면 굉장히 비효율적인 것 처럼 보이는데

실제로 Context Switching 너무 잦으면 오버헤드가 발생하여 ( 비용이 높아 ) 성능이 떨어진다는 단점을 가집니다.

 

그래서 등장한 것이 바로 Thread (스레드) 입니다.

 


Thread (스레드)

“프로세스 내에서 실행되는 흐름의 단위” 

프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개 동시에 실행 시 킬 수 있는 것입니다. ( 경량화된 프로세스 )

⇒ Ex ) 햄버거란 프로세스 안에는 패티를 굽는 스레드, 빵을 굽는 스레드가 있다.

( 어플리케이션 하나가 프로세스이고, 그 안에서의 서비스들이 스레드가 되는 셈. ) 

 

스레드Code, Data, Heap 을 공유하여 공통된 자원을 사용하고 Stack 부분만 따로 가지고 있습니다.

자원을 공유한다는 특성 때문에 Context Switching 이 일어날 때 캐싱 적중률이 올라갑니다.

즉, 실행 - 대기 상태를 반복할 필요가 없어 효율적입니다.

 

스레드의 특징
  • 프로세스 내에 여러개 생길 수 있다.
  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

 

 


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

프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유한다.

 

예시를 통해 차이점을 쉽게 알아봅시다.

 

프로세스 방식일 경우

첫 손님이 PC방에서 게임을 하고 나갈때 게임에 필요한 키보드, 모니터, 마우스, 본체를 들고 나가고

다음 손님은 게임에 필요한 키보드, 모니터, 마우스, 본체를 챙겨와 게임을 해야합니다.

즉, 자원을 공유하지 않기 때문에 어차피 공통적으로 사용할 키보드, 모니터, 마우스, 본체를 들고 나가버린겁니다.

 

 

스레드 방식일 경우

첫 손님이 PC방에서 게임을 하고 나가면 다음 손님은 준비물 없이 그대로 와서 게임을 즐길 수 있습니다. 

즉, 자원을 공유하기 때문에 어차피 공통적으로 사용할 키보드, 모니터, 마우스, 본체그대로 있어 그 자리에서 게임을 즐길 수 있습니다.

 


여기까지 프로세스와 스레드에 대해 개념과 차이점을 쉽게 알아보았습니다.

다음 포스팅에서는 멀티 프로세스와 멀티 스레드에 대해 알아보도록 하겠습니다.

 

멀티 프로세스와 멀티 스레드란 ?

이전 포스팅에선 프로세스와 스레드에 대해 알아보았습니다. 이번 포스팅에선 멀티 프로세스와 멀티 스레드에 대해 알아볼건데요. 프로세스와 스레드가 무엇인지에 대해 이해가 안가신다면 아

hstory0208.tistory.com

 


참고자료
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4
https://www.youtube.com/watch?v=1grtWKqTn50