본문 바로가기

개발/Backend

프로세스(Process)와 스레드(Thread)

프로세스

크롬 창을 띄운 노트북

우리는 휴대폰이나 컴퓨터를 통하여 다양한 프로그램을 사용합니다.

지금 이 글을 보고 있는 순간에도 크롬이나 다른 인터넷 브라우저를 사용하고 있을 텐데요,

이러한 프로그램이 실행되는 단위프로세스라고 합니다.

 

조금 다른 측면에서 이야기해보자면,

컴퓨터의 운영체제는 컴퓨터의 자원을 관리하는 역할을 하는데,

실행 가능한 프로그램 파일을 메모리에 올리고 이를 프로세스로 실행시키기도 합니다.

그러니까 프로세스는 운영체제로부터 할당받는 자원의 단위라고 할 수 있겠습니다.


내 컴퓨터의 프로세스

이런 단위를 눈으로 확인해보려면 macOS를 기준으로,

spotlight에서 activity monitor를 검색해보면 아래처럼 눈으로 확인해 볼 수 있습니다.

Activity Monitor 캡처 화면

캡처화면 하단 우측에 따르면 약 660개의 프로세스와 약 5000개의 스레드가 실행 중인 걸 알 수 있네요.

 

각 프로세스마다는 Threads 라는 컬럼이 있습니다.

우리가 알아 볼 개념 중 하나인데, 직관적으로 하나의 프로세스에 하나 이상의 스레드가 있다는 걸 알 수 있습니다.

 

또, 같은 프로세스 이름을 가진 프로세스가 여러 개 있는 것도 확인할 수가 있네요.

 

프로세스마다 고유의 ID인 PID를 가지는 것도 볼 수 있습니다.

개발을 하다 보면 종종 프로세스를 종료시키고 싶은데 제대로 종료가 안 될 때가 있어서

`sudo kill -9 PID`를 종종 사용하는 건 저 뿐만이었을까요...


프로세스의 메모리 구조

스레드를 알아보기 전에 프로세스의 메모리 구조를 간단하게 알고 넘어가려고 합니다.

프로세스의 메모리는 크게 아래의 구조로 이루어져 있습니다.

프로세스의 구조

각각의 영역에 대하여 간단하게 살펴보면 아래와 같습니다.

  • stack: 함수 호출이 일어날 때 사용되는 지역변수나 매개변수 혹은 리턴 값 등등의 일시적인 데이터
  • heap: 동적 메모리 영역, 필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역
  • data: 프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환되는 전역변수나 정적변수 등의 데이터
  • code: 실행 명령을 포함하는 코드가 들어가는 부분, 기계어가 저장되어있고 읽기 전용 영역

프로세스의 경우에는 이런 메모리 영역이 각각 독립인데, 이렇다 보니 프로세스 간 context switching을 하는 코스트가 높습니다.


스레드

다시 올라가서, 하나의 프로세스는 여러 개의 스레드를 가질 수 있었습니다.

그러니깐 스레드가 무어냐 묻는다면 프로세스 내에서 실행되는 단위라고 할 수 있습니다.



멀티 스레드

하나의 프로세스는 최소 하나의 메인 스레드를 가지고 있는데요.

스레드의 heap, data, code 영역은 프로세스의 자원을 사용합니다.

그러니까 함수 호출과 관련 있는 stack 영역만 아래의 그림처럼 별도로 할당하게 되는 것입니다.

 

위의 그림처럼 하나의 프로세스 내에서 여러 스레드로 나뉘어서 실행되는 단위를 가지는 경우를 멀티스레드라고 합니다.

스레드는 stack 영역만 별도로 할당하고, 나머지 자원은 공유하다 보니, context switching 비용이 절감될 수 있습니다.

 

한편, 일부 메모리를 공유함으로써 하나의 스레드의 결과가 다른 스레드에 영향을 끼칠 수도 있게 됩니다.



멀티 프로세스

멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스로 구성하여 각각의 프로세스가 병렬적으로 작업을 수행하는 것을 의미합니다.

멀티 프로세스의 경우에는 멀티 스레드와 다르게 메모리를 공유하지 않기 때문에, 멀티 스레드에서처럼 다른 스레드에 영향을 주는 문제가 발생하지 않게 됩니다.

다만, 작업량이 많아지면 오버헤드가 발생할 수 있습니다.
또 프로세스간 통신을 하기 위해서는 조금 복잡한 통신 방식(IPC)이 필요합니다.



[참조]

'개발 > Backend' 카테고리의 다른 글

모르면 손해보는 git rebase (1)  (3) 2024.10.13
HTTP/3, HTTP over QUIC  (0) 2022.07.24
[redis] redis의 데이터 타입  (0) 2021.06.17
[chrome dev summit 2021] Payment and address form best practices  (0) 2021.06.10
[kafka] Kafka란  (0) 2021.01.28