프로세스 vs 스레드

박병욱·2025년 4월 22일
0

TIL

목록 보기
5/11
post-thumbnail

🚴‍♀️프로그램이 실행 중인 상태, 프로세스 (Process)

프로그램이란 쉽게 “어떤 일을 수행하기 위해 만들어진 명령 모음” 이라고 생각하면 된다.  프로그램을 다른 관점에서 이야기하면 명령의 모음이 파일로 빌드되어 보조 기억 장치(여러 가지 음식 재료가 냉장고 안)에 저장되어 있는 정적인 상태라고 할 수 있다. 우리가 프로그램 실행 명령을 내리면 CPU는 보조 기억 장치에서 꺼내 메인 메모리에 올려놓고 코드를 해석하며 작업을 시작한다. 이처럼 “프로그램이 메인 메모리로 올라와 실행되고 있는 상태” 를 ”프로세스” 라고 한다.

 

🧑‍🧑‍🧒‍🧒 프로세스를 또 나눈 단위, 스레드 (Thread)

한 프로세스 안에 여러 작업이 동시에 진행되기도 한다. 예를 들어 채팅 앱은 사용자가 메시지를 입력하는 도중에도 상대방이 새로운 메시지를 보냈는지 계속해서 확인한다. 만약 상대방이 이전 메시지로 보낸 동영상에 “받기” 를 누른 상태라면 채팅을 하는 동시에 동영상 다운로드까지 함께 진행되는 것이다. 이처럼 “한 프로세스 안에 하나 이상 진행될 수 있는 일의 단위” 를 ”스레드” 라고 한다.

 

❗️용어 구분

  • 실행 단위 : CPU 코어에서 실행하는 하나의 단위로, 프로세스와 스레드를 모두 포괄하는 개념이다. 이 실행 단위라는 것은 상황에 따라 프로세스일 수도 있고, 스레드일 수도 있는 것이다.
  • (부연 설명이 없는) 프로세스 : 단 하나의 스레드만 가지고 있는 단일 스레드 프로세스다. 여기서 하고 싶은 말은, 프로세스와 스레드는 서로 완전히 다른 무언가는 아니라는 것이다.
  • 동시성 : 한 순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것이다.

 

예를 들어보자. 피자집에서 피자를 주면 했는데, 피자 레시피를 주면서 피자 나왔다고 한다면? 엄청 황당할 것이다. 여기서 해당 레시피는 우리가 열심히 구현하고 있는 코드 파일(프로그램)을 말한다. 알다시피 이 코드 파일은 실행시키기 전까지는 그저 코드가 구현되어 있는 파일에 불과하다. 이게 실제 피자가 되려면 실행되어서 사용할 수 있는 무언가가 되어야 하는데, 이게 바로 “프로세스” 라는 것이다.

그럼 프로그램이 프로세스가 되면서 어떤 일이 일어날까? 간단하게 2가지가 있다.

일단 프로세스가 필요로 하는 재료들이 메모리에 올라가야 한다. 그 메모리에는 4가지 영역, “Code 영역”, “Data 영역”, “Heap 영역”, “Stack 영역” 이 있다. 두 번째로 해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이 프로세스 생성 시에 함께 만들어진다. 이 PCB 블럭에도 엄청 많은 정보들이 들어 있는데, 간단하게 말하자면 프로세스 상태 중에 준비 상태나 대기 상태의 큐를 구현하기 위한 포인터, 현재 프로세스 상태를 담고 있는 Process State, 프로세스의 고유 번호를 담고 있는 PID, 다음 명령어를 가리키는 Program Counter 등이 있다.

 

⚒️ Process & Thread

사람들은 대부분의 사람들은 하나의 프로세스만 사용하기보다는, 여러가지를 동시에 사용하고 싶어 한다. 하지만 원래 한 프로세스를 실행하기 위해서 CPU를 점유하고 있으면 다른 프로세스는 실행 상태에 있을 수 없다. 그래서 다수의 프로세스를 동시에 실행하기 위해 여러 개 프로세스를 시분할로, 즉 짧은 전환을 반복해서 실행시키도록 한다.

동시에 실행하고 싶은 프로세스 2개가 있다고 가정해보자. 2개가 준비 상태와 CPU를 점유하고 있는 실행 상태를 치열하게 번갈아 가면서 경쟁해야 한다. 이 과정이 바로 “컨텍스트 스위칭” 이다. 2개만 생각해도 숨 막히는데 카카오톡도 열고, 인텔리제이도 열고, 유튜브 뮤직도 틀고, 블로그도 작성하면서, 노션도 들여다 본다면? 이미 머리가 꼬일 지경이다.

그래서 등장한 것이 경량화된 프로세스 버전인 “스레드” 인 것이다. 왜 “경량화” 된 프로세스냐 하면, 하나의 프로세스 안에 다수의 스레드가 있을 때 “공유되는 자원” 이 있기 때문이다. 아까 살펴봤던 메모리 영역에서 스레드는 Code, Data, Heap 영역을 공통된 자원으로 사용한다. 각 스레드는 Stack 부분만 따로 가지고 있는 것이다. 이처럼 공유되는 자원이 있기 때문에 컨텍스트 스위칭이 일어날 때, 캐싱 적중률이 올라가 매우 효율적이다. 쉽게 말해, 모조리 다 빼고, 다시 다 넣을 필요가 없다는 것이다.

 

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

멀티 프로세스와 멀티 스레드 개념은 모두 한 애플리케이션에 대한 “처리 방식의 일종” 이다. 예를 들어서 여러 사용자가 로그인을 요청하는 상황을 생각해보자.

한 프로세스는 매번 하나의 로그인만 처리하기 때문에 동시에 처리할 수 없다. 그래서 부모 프로세스가 fork() 를 통해 자식 프로세스를 여러 개 만들어서 일을 처리하도록 한다. 이 때 자식 프로세스는 부모와 별개로 메모리 영역을 확보하게 된다. 반면, 스레드는 한 프로세스 내에서 구분되어진 실행 단위다. 프로세스 내에서 분리해서 여러 스레드로 나뉘어 실행 단위가 나뉘어지면, 그게 바로 “멀티 스레드” 인 것이다. 인텔리제이에서 코드를 수정하면서 추천 코드도 보여져야 되고, 테스트도 돌리는 동시에 코드를 수정할 수도 있어야 한다. 이렇게 한 애플리케이션에 대한 작업의 단위가 나뉘어져야 할 때가 많다. 이때 각각의 스레드가 그 작업들을 담당하는 것이다.

이렇게 알아보면, 멀티 스레드가 훨씬 더 좋아 보이는데 왜 멀티 프로세스를 사용할까?

예전에 인터넷 익스플로러를 사용하다가 이런 끔찍한 화면을 마주치고 곧 모든 탭이 닫힐 때가 꽤 있었을 것이다. 이게 바로 멀티 스레드를 사용해서 벌어진 일이다. 긴밀하게 연결되어 있기 때문에 한 스레드, 즉 한 탭에 문제가 생기면 전체 프로세스에 영향이 가는 것이다. 반면, 구글 크롬 같은 경우에는 멀티 프로세스를 이용하기 때문에 위와 같은 화면을 본 적이 없을 것이다.

 

⚡️ 멀티 코어 (Muti-Core)

앞서 살펴봤던 멀티 프로세스와 멀티 스레드는 “처리 방식의 일종” 이기 때문에 소프트웨어 분야에 가깝고 “멀티 코어” 는 하드웨어에 더 가깝다. 멀티 코어와 관련된 키워드는 “동시성”“병렬 처리” 이다.

위와 같이 싱글 코어를 가진 CPU가 실행 단위를 처리할 때는 동시에 여러가지가 진행되기 위해서 빠른 전환이 필요하다고 했었다. 그 개념이 바로 “동시성” 이다. 짧은 순간에 CPU 시간을 분할해서 동시에 하는 것처럼 보이게 하는 것이다.

하지만, 멀티 코어는 “병렬 처리”, 즉 물리적으로 여러 코어를 사용해서 다수의 실행 단위를 한순간에 처리할 수 있도록 한다. 다수의 프로세서로 여러가지 일을 각 코어에서 진행하는 것이다.

 

그렇다면, 프로세스와 스레드, 코어는 많으면 많을수록 좋은 것일까? 벌써 느낌이 쎄하다. 결론부터 말하자면, 프로세스, 스레드, 코어의 수가 많을수록 시스템 성능이 향상된다고 생각할 수 있지만, 실제로는 그렇지 않을 확률이 크다.

1. 프로세스가 많으면?

각 프로세스는 독립된 메모리 공간을 가진다. 그래서 많은 프로세스가 동시에 실행되면 메모리 사용량이 급격히 증가할 수 있다. 또한, 프로세스를 생성하고 관리하는 데는 상당한 시스템 자원이 소모되며, 프로세스 간 통신(IPC)이 필요할 경우 성능 저하가 발생할 수 있다. 프로세스 간 컨텍스트 스위칭은 스레드 간 컨텍스트 스위칭보다 더 많은 오버헤드를 수반하기 때문에, 프로세스 수가 많아지면 시스템 성능이 저하될 수 있다. 운영체제는 동시에 실행할 수 있는 프로세스 수에 제한이 있으며, 이를 초과하면 새로운 프로세스 생성이 불가능하거나 시스템이 불안정해질 수 있다.

2. 스레드가 많으면?

스레드가 지나치게 많아지면 운영체제가 스레드 간 컨텍스트 스위칭을 자주 수행해야 하여 CPU 자원이 스레드 관리에 소모된다. 이로 인해 실제 작업 수행 효율이 떨어질 수 있으며, 많은 스레드가 동시에 실행될 경우 메모리나 캐시, 락 등의 자원을 경쟁하게 되어 성능 저하나 데드 락이 발생할 가능성이 높아진다. 또한, 스레드가 많아지면 동기화와 상태 관리가 복잡해져 버그 발생 가능성도 커진다.

3. 코어가 많으면?

많은 코어를 가진 CPU는 병렬 처리 성능을 향상시킬 수 있지만, 이를 최대한 활용하기 위해서는 소프트웨어가 멀티코어 환경에 최적화되어 있어야 한다. 단일 스레드 작업이 주를 이루는 경우, 추가 코어의 이점을 제대로 활용하지 못할 수 있는 것이다. 또한, 코어 수가 많아질수록 CPU의 비용과 전력 소비가 증가할 수 있으며, 발열 관리도 더 어려워진다.

 


<참고 자료>
[10분 테코톡]🌷 코다의 Process vs Thread
CPU가 멀티태스킹을 하는 방법 : 프로세스 VS 스레드

profile
도메인을 이해하는 백엔드 개발자(feat. OOP)

0개의 댓글