본문 바로가기

IT 상식/개발 상식

[Process] 프로세스(Process)와 쓰레드(Thread)에 대한 이해

<Process와 Thread>

프로세스(Process) 란?

프로세스는 실행될 때 운영체제로부터 각각 독립되 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 기본적으로 하나의 프로세스가 생성되면 하나의 쓰레드가 같이 생성된다. 이를 메인 쓰레드라고 부르며, 쓰레드를 추가로 생성되지 않으면 모든 프로그램 코드는 메인 쓰레드에서 실행된다. 각 프로세스는 별도의 주소 공간에서 실행되며 프로세스 간에 변수나 자료구조에 접근할 수 없다. 프로세스간 통신은 IPC(Inter-Process Communication)을 사용해야한다. 예를 들어서 파이프라인, 파일, 소켓 등이 이에 해당된다.
 
  • 운영체제로 부터 시스템 자원을 할당받는 하나의 독립적인 작업 단위
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 동적인 개념으로는 실행되고 있는 프로그램을 의미

쓰레드(Thread) 란?

쓰레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내에서 각각의 Stack만 할당 받고 Code, Data, Heap 메모리 영역은 공유한다.  쓰레드는 쓰레드ID, PC(Program Counter), Register집합, Stack으로 구성된다.
 
  • 프로세스 안에서 실행되는 여러 흐름의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스 내의 주소 공간이나 자원들을 대부분 공유

Process의 메모리 영역

  • Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
  • Data : 전역변수, 정적변수, 배열 등 (초기화된 데이터)
  • Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
  • Heap : 동적 할당 시 사용(new(), Mallock() 등)

 

Multi-Process 와 Multi-Thread

멀티 프로세스(Multi-Process)

하나의 응용프로그램을 여러 개의 프로세스로 구성하여 프로세스가 하나의 작업(Task)를 처리하도록 하는 것이다.
 
  • 장점
    여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스가 죽는 것 이상으로 다른 영향이 확산되지 않는다.
  • 단점
    - Context Switching에서의 오버헤드
       .- Context Switching 과정에서 캐쉬 케모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등 오버헤드가 발생하게 된다.
       .- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어서 Context Switching이 발생하면 캐쉬가 있는 모든 데이터를 리셋하고 다시 캐쉬 정보를 부러와야 한다.
    - 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
       .- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.

 

멀티 쓰레드(Multi-Thread)

하나의 응용프로그램을 여러 개의 쓰레드로 구성하고 각 쓰레드로 하여금 하나의 작업(Task)를 처리하도록 하는 것이다. 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하지만 멀티 쓰레딩을 기본으로 하고 있다.
웹 서버는 대표적인 멀티 쓰레드 응용 프로그램이다.
 
  • 장점
    - 시스템 자원 소모 감소(자원의 효율성 증대)
       .- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
    - 시스템 처리량 증가(처리 비용 감소)
       .- 프로세스 간 통신보다 쓰레드간 통신이 비용이 적으므로 통신 비용이 감소
       .-쓰레드 사이의 작업량이 작아 Context Switching이 빠르다.
  • 단점
    - 주의 깊은 설계가 필요하다.
       .-미묘한 시간, 잘못된 변수 공유로 오류 발생 확률 증가
    - 디버깅이 까다롭다.
    - 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.(Why??)
    - 멀티 쓰레드의 경우 자원 공유의 문제가 발생한다.(동기화 문제)
    - 하나의 쓰레드에 문제가 생기면 전체 프로세스가 영향을 받는다.

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

멀티 쓰레드를 사용하는 이유는 쉽게 설명하면 프로그램을 여러 개 실행하는 것보다 하나의 프로그램 안에서 여러 작업을 수행하는 것이 자원 효율성, 처리 비용 감소, 응답 시간 단축 등 장점이 있기 때문이다.
<Process와 Thread의 Memory 공유 영역>

 

  • 자원의 효율성 증대
    - 멀티 프로세스로 실행되는 작업을 멀티 쓰레드로 실행할 경우 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
    - 프로세스 간 Context Switching 시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화되므로 오버헤드가 크기 때문이다.
    - 쓰레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 쓰레드가 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
  • 처리비용 감소 및 응답 시간 단축
    - 쓰레드는 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 프로세스간의 통신(IPC)보다 쓰레드 간 통신의 비용이 적다.
    - Context Switching 시 쓰레드는 Stack 영역만 처리하기 때문에 전환 속도가 빠르다.