반응형

 

신입 개발자 기술 면접을 볼 때 항상 나오는 단골 질문 사항입니다. 프로세스와 스레드의 차이를 알고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 묻기 위한 질문이며, 그만큼 중요한 사항이니 자주 질문하는 것 같습니다.

 

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

프로그램

파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태이며,
어떠한 작업을 위해 실행할 수 있는 파일을 뜻합니다.

 

프로세스

프로그램이 메모리에 올라와 운영체제로부터 CPU를 할당받고 프로그램이 실행되고 있는 상태.
즉, 일을 처리하는 일련의 과정을 뜻합니다.

  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
  • 메모리에서 올라와 실행되고 있는 프로그램 인스턴스
  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 각 프로세스는 별도의 주소 공간에서 실행되고 프로세스끼리는 자원을 공유하지 않음
  • 하나의 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신 필요
    (IPC, inter-process communication) Ex. 메일 슬롯, 파이프, 소켓, 시그널, 공유 메모리

- 할당받는 시스템 자원

  • Code, Data, Stack, Heap 구조로 되어있는 독립된 메모리 영역
  • 주소 공간
  • CPU 시간

 

스레드

프로세스 내에서 실행되는 흐름의 단위로, 프로세스 하나에 자원을 공유하면서
일련의 과정을 여러 개 동시에 실행 시 킬 수 있는 것을 말합니다.

  • 하나의 프로세스 내의 주소 공간이나 자원들 공유
  • 하나의 프로세스가 생성되면 하나의 스레드(메인 스레드)가 생성됨
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
  • 스레드는 프로세스 내에서 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유

 

 

📌 멀티 프로세스와 멀티 스레드의 차이

멀티 프로세스

하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스에 영향이 확산되지 않음
  • 구현이 간단
  • 각 프로세스들이 독립적으로 동작(자원이 서로 다르게 할당됨) 하기 때문에 안정적
  • 멀티 스레드 보다 많은 메모리 공간과 CPU 시간을 차지
  • 작업량이 많을수록 오버헤드가 발생하고 Context Switching으로 인한 성능 저하 우려
  • 프로세스 간의 통신을 하기 위해서는 IPC를 통해야 함

 

멀티 스레드

하나의 응용 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하도록 하는 것

  • 시스템의 자원과 처리 비용 감소(실행 속도 상승)
  • Context Switching이 빠름(스레드는 Stack영역만 처리하면 되기 때문)
  • 스레드 간의 자원(Code, Data, Heap)을 공유하고 있기 때문에 통신의 부담이 적어 응답 시간이 빠름
  • 스레드가 개별로 유기적으로 움직이고 있기 때문에 프로그램 테스트, 디버깅이 어려움
  • 스레드 간의 데이터 공유 시 동기화 문제 발생
  • 하나의 스레드의 오류로 전체 프로세스에 문제 발생
  • 너무 많은 스레드 사용은 오버헤드를 발생

 

<멀티 프로세스 vs 멀티 스레드>

종류 멀티 프로세스 멀티 스레드
장점 -하나의 프로세스가 죽어도 다른 프로세스에는 영향을 끼치지 않음  - 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리 가능
- Code, Data, Heap 영역을 공유하기 때문에 데이터를 주고 받는 것이 간단해지고 자원 소모가 적음
- 스레드 사이 작업량이 작아 문맥교환이 빠르며 시스템 처리량 증가
단점 - 각각 독립된 메모리 영역을 갖고 있어 작업량이 많을수록 오버헤드가 발생하고 문맥 교환(Context Switching)으로 인한 성능 저하를 유발
- 프로세스 사이의 통신이 복잡(IPC)
- 프로그램 디버깅이 까다로움
- 하나의 스레드에 문제가 생기면 전체적인 프로세스에 영향을 끼침
- 동기화 문제 발생(전역 변수를 이용하기 때문)
- 단일 프로세스 시스템에서 효과를 기대하기 어려움
- 다른 프로세스에서 스레드 제어 불가

 

 

📌 멀티 프로세스 대신 멀티 스레드를 사용하는 이유

자원을 효율성 증대, 처리 비용 감소, 응답 시간 단축

프로세스 생성 시 자원을 할당하는 시스템 콜이 줄어들어 자원 소모가 적고 자원을 효율적으로 관리할 수 있습니다. 또한 프로세스의 경우 Context Switching 시 CPU 레지스터, RAM과 CPU 사이의 캐시 메모리가 초기화되기 때문에 오버헤드가 큰 반면, 스레드는 Context Switching시 Stack영역만 처리하면 되므로 스레드 간의 문맥 교환 속도가 빠릅니다. 그리고 프로세스의 경우 프로세스 간의 통신을 위해서는 IPC를 통해서 통신을 해야 하지만, 스레드의 경우 스레드 간의 자원 공유가 간단하기 때문에 시스템 자원 소모가 작습니다. 

그러나 전역 변수를 통해 스레드 간의 자원을 공유하기 때문에 동기화 문제는 잘 해결해야 합니다.

 

 

 

📚 참고

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

반응형

+ Recent posts