Process vs Thread

청포도봉봉이·2024년 3월 15일
1

Computer Science

목록 보기
1/2
post-thumbnail

오늘은 Process와 Thread의 차이점에 대해 알아보겠습니다. 너무나도 헷갈리고 아리까리해서 정리해봤습니다.

Program, Processor, Process

말이 너무 비슷합니다. 프로그램, 프로세서, 프로세스 특히 저는 프로세서프로세스가 너무 헷갈리더라고요. 같이 알아가보도록 합시다!

프로그램(Program)

프로그램은 윈도우의 *.exe이나 Mac의 *.dmg와 같은 컴퓨터에서 실행 할 수 있는 파일을 말합니다.



위의 사진처럼 카카오톡이나 게임 실행 파일을 다운받으신 적이 있으실 겁니다! 단 파일을 실행하지 않은 상태이기 때문에 정적 프로그램(Static Program)을 줄여서 프로그램(Program)이라고 부른 것입니다.

프로세서(Processor)

프로세서는 하드웨어(기계)의 영역입니다. 시스템의 주 프로세서인 중앙 처리 장치(CPU)를 가리키는 데 자주 사용됩니다. 그냥 CPU와 프로세서는 같은 개념이라고 생각해도 됩니다.

프로세스(Process)

프로세스는 실행 중인 프로그램을 의미합니다. 컴퓨터에서 여러 개의 프로세스가 동시에 실행되며, 각각이 독립적으로 메모리와 CPU 시간을 할당받아 작업을 수행합니다.

위 그림에서 저 아이콘들은 사용 중인 각각의 프로세스입니다.

그리고 우리는 이 여러가지의 프로세스들을 동시에 이용하고 있다고 생각합니다.

  • 인텔리제이로 런타임을 실행하면서
  • 카카오톡을 보면서
  • 브라우저를 보면서
  • 포스트맨으로 API 테스트를 하면서
  • 터미널로 ssh 접속을 하면서
  • 슬랙 메세지를 작성하는 중

하지만!!

사실은 인텔리제이가 실행 중이라면 다른 프로세스(실행 중인 브라우저, 카톡 등등)들은 실행 상태에 있을 수 없습니다. 인텔리제이 런타임을 실행하고 있다면 인텔리제이 뺀 프로세스들은 작동을 멈추고 있는 거죠.

그렇다면 왜 우리는 동시에 벌어지고 있는거처럼 보일까요?

그래서 여러 개의 프로세스를 시분할 방식, 즉 엄청 짧은 텀을 반복하면서 동작시켜 동시에 일어나는 것처럼 보이게 합니다. 이를 다중 프로세싱 또는 멀티태스킹이라고 합니다. (사람도 멀티태스킹이 가능하죠?)

Context Switching(컨텍스트 스위칭)

이걸 CPU의 개념으로 한번 살펴보겠습니다.

인텔리제이를 실행되어서 CPU에 적재되어 있다면 카카오톡은 준비상태가 되어야 합니다.

카카오톡을 실행하려면 아래와 같이 인텔리제이가 먼저 준비상태로 내려가고

카카오톡이 실행 상태가 되어야 합니다.

다시 인텔리제이를 실행하려면 카카오톡이 준비상태가 되어야하고

인텔리제이가 실행 상태가 되어야 합니다.

이 과정을 계속 엄청나게 빠른 속도와 짧은 시간으로 반복하는 것 입니다. 이게 바로 컨텍스트 스위칭입니다. 지금 2개의 프로세스의 과정을 봤는데도 머리가 아프죠?

프로그램이 프로세스가 되면서 어떤일이 일어날까요?

  1. 일단 프로세스가 필요로하는 재료들이 메모리에 올라가야 합니다.

위의 영역들이 메모리의 공간을 차지합니다.

  1. 그리고 해당 프로세스에 대한 PCB 블럭이 만들어집니다.

Thread(스레드)

그래서 등장을 하는게 경량화된 프로세스 버전인 스레드입니다. 왜 경량화된 버전이냐면 아래와 같이 하나의 프로세스안에 다수의 스레드가 있을때 공유되는 자원이 있기 때문입니다.

위 그림을 살펴보면 각 스레드는 스택 부분을 따로 가지고 있죠. 이는 매우 효율적입니다. 공유되는 자원이 있기 때문에 컨텍스트 스위칭이 일어날때 캐싱 적중률이 올라갑니다.

쉽게 말해서 모조리 다 빼고 다시 다 넣을 필요가 없다는 겁니다.

예시를 들어보겠습니다.

  1. 공연장에서 콘서트가 열렸고 여러 밴드들이 공연을 위한 준비를 하고 있다고 생각했을때 첫번째 밴드의 공연이 끝난 후 밴드는 개인 장비만 챙겨서 대기실로 이동을 합니다.
  2. 다음 공연 밴드는 마이크나 음향 장비는 무대에 있는 그대로 사용을 하고 개인 장비만 바꿔주면 됩니다.

하지만 프로세스의 컨텍스트 스위칭은 첫번째 밴드가 공연을 한 후 음향장비와 마이크 무대의 모든 요소들을 들고 나가버린 상황인 것입니다.

스레드 컨텍스트 스위칭은 개인 악기만 들고오기만 하면 되니 훨씬 간단하고 부담이 적은 과정이죠?

Multi-process & Multi-thread

그럼 이제 멀티 프로세스와 멀티 스레드에 대해서 알아보겠습니다.

이 설명을 하기전에 주의할 점이 있는데 멀티 프로세스와 멀티 스레드 이 두가지 개념이 모두 처리방식의 일종이라는 것 입니다. 그러니까 한 어플리케이션에 대한 처리방식이라고 생각하면 편합니다.

단순히 여러 프로그램을 여러 개 띄워놓은게 멀티 프로세스라 한다면 멀티 쓰레드와 비교해서 설명하기가 어렵습니다. 그래서 여기서는 한 어플리케이션에 대한 다른 처리방식에 대해서 이야기하는구나 라고 이해를 하고 설명하겠습니다.

한 어플리케이션이 여러가지 일을 할 때가 있습니다. 예를 들어서 여러 사용자가 상품 검색 API를 요청하는 상황이 있다면 한 프로세스는 매번 하나의 검색만 처리할 수 있기 때문에 동시에 처리할 수 없습니다. 그래서 부모 프로세스가 fork()를 해서 자식 프로세스를 여러개 만들어서 작업을 처리하게 됩니다.

이 때 자식 프로세스는 부모와 별개로 메모리 영역을 확보하게 됩니다.

반면에 멀티 스레드는 한 프로세스 내에서 구분지어진 실행 단위(흐름)입니다. 즉 하나의 프로세스 안에 여러개의 스레드가 있는 것을 말합니다.

우리가 롤이라는 게임을 한다고 생각을 했을때
1. 캐릭터 움직임 처리: 게임 내에서 캐릭터를 움직이는 것. 이는 한 스레드가 담당합니다.
2. 스킬 사용 및 쿨다운 처리: 동시에 스킬을 사용하고, 그 스킬의 쿨다운을 관리하는 작업도 별도의 스레드에서 처리됩니다.
3. 미니맵 및 시야 처리: 미니맵 상의 정보 업데이트와 시야를 관리하는 것도 다른 스레드가 담당합니다.
4. 채팅 및 통신 처리: 게임 중에 팀원들과의 채팅이나 통신은 또 다른 스레드에서 처리되어, 게임 플레이에 방해 없이 소통할 수 있습니다.

롤에서 이렇게 여러 스레드가 동시에 작업을 수행함으로써, 게임은 매끄럽게 진행됩니다. 만약 이런 작업들이 모두 하나의 스레드에서 순차적으로 처리된다면, 캐릭터를 움직이는 동안 스킬을 사용할 수 없거나, 채팅을 하는 동안 게임이 멈추는 등의 문제가 발생할 수 있습니다.

프로세스는 독립적이기 때문에 IPC를 사용해서 통신해야 합니다. 그리고 자원이 소모적이고 개별적인 메모리를 차지하고 있습니다. 하지만 개별 독립적이기 때문에 동기화 작업이 필요하지 않습니다.

반면 스레드는 공유 자원이 많으므로 긴밀하게 연결되어 있습니다. 그래서 공유된 자원으로 통신 비용이 절감됩니다. 컨텍스트 스위칭 비용도 적습니다. 하지만 공유 자원을 관리해줘야 하죠.

그렇다면 멀티 스레드가 더 좋아보이는데 왜 멀티프로세스를 이용할까요?

인터넷 익스플로어는 멀티 스레드를 사용했습니다. 그래서 여러 개의 탭을 사용 중에 1개의 탭이 오류가 나면 익스플로어 프로그램이 종료되어 버립니다.

하지만 크롬은 멀티 프로세스를 사용하여 여러 개의 탭을 사용 중에 1개의 탭이 오류가 나도 다른 탭을 사용 할 수 있습니다.

다 장단점이 존재하는 겁니다.

멀티 코어

그럼 멀티 코어가 뭘까요? 멀티 프로세스, 멀티 쓰레드도 있고요.
그리고 싱글 코어에서는 멀티 프로세스, 멀티 쓰레드가 작동을 할까요 안할까요?

멀티 프로세스, 멀티 쓰레드 처리 방식의 일종이기 때문에 소프트 웨어 분야에 가깝고
멀티 코어는 조금 더 하드웨어 측면에 가깝습니다. 멀티 코어와 관련된 키워드는 동시성과 병렬 처리입니다.

위의 싱글코어를 가진 CPU에서 실행 단위를 처리 할 때는 동시에 여러가지를 처리하기 위해서 빠른 텀으로 전환이 되면서 실행이 된다고 말했는데 그게 동시성입니다.

앞서 말한거처럼 여러 개의 프로그램을 사용해도 우리는 동시에 사용하는 거처럼 느끼고 있습니다. 동시성은 짧은 순간에 cpu의 시간을 분할해서 동시에 하는 것처럼 보이게 합니다.

하지만 멀티 코어는 병렬 처리, 즉 물리적으로 여러 코어를 사용해서 다수의 실행 단위를 한 순간에 동시에 처리할 수 있게 해준 것입니다.

하나의 작업을 코어의 개수만큼 작은 작업 단위로 분할하여 병렬로 처리하는 방식이 있습니다. 이를 작업 분할 또는 태스크 분할이라고 합니다. 각 작은 작업 단위는 독립적으로 실행될 수 있으며, 각각의 작업 단위는 서로 다른 코어에 할당되어 병렬로 처리됩니다.




프로그램, 프로세서, 프로세스, 멀티 프로세서, 멀티 프로세스, 멀티 코어의 개념과 차이점을 살펴보았습니다. 이 내용들에 관해서 장단점 등에 대해서는 깊게 다루지 못했으니 찾아보시길 추천드립니다!

profile
서버 백엔드 개발자

0개의 댓글