Multi-process VS Multi-Thread

윤강석·2022년 9월 23일
0
post-custom-banner

최대한 내가 이해한 바에 맞춰 쉬운말로 글을 작성해보려 한다.
다중 ~ 을 설명하기에 앞서 프로세스와 스레드의 차이는 무엇인가? 간단하게 정리하면

  • 프로세스(Process) : OS로부터 리소스를 할당 받는 작업 단위
  • 스레드(Thread) : 프로세스로부터 리소스를 할당 받는 작업 단위

로 쓰여진다. 요약하자면 스레드는 프로세스 내부에서 작동하는 실행 단위로 둘은 다른 작업 단위 정도로 생각이 된다. 아래에는 조금 더 구체적으로 프로그램이 작동되는 데에 있어 전체적인 그림이 어떠한가에 대해서 정리해보겠다.

1. 프로세스(Process)

위에서 설명한 바와 같이 프로세스는 OS로부터 직접 프로그램 리소스를 할당 받는다. 가령 A 라는 프로그램을 실행하기 위해서 우리는 A.exe 라는 파일을 실행하게 될 것이다. 이 때 실행하게 되는 것이 프로세스이다. 이 때 크게 두가지의 작업이 실행되게 된다.

  1. 프로세스가 필요로 하는 재료들을 담을 메모리 할당
  2. 프로레스의 내용을 담을 PCB 블록 생성
  • 메모리 구성
    - code : 실행코드를 담는 영역
    - data : 정적 변수 또는 전역 변수를 담는 영역
    - heap : 동적 메모리 영역
    - stack : 지역 변수, 매개 변수, 반환 값 등 일시적인 데이터를 담는 영역

  • PCB블록 구성
    - PID(process identification) : 프로세스 식별번호
    - 프로세스 상태 : 실행 중 또는 대기 중에 대한 현재 상태
    - 프로그램 카운터 : 다음 실행할 명령어 주소
    - 스케줄링 우선순위 : 여러개의 프로세스를 실행할 순서
    - 권한 : 프로세스가 접근 가능한 자원에 대한 정보
    - 부모&자식 프로세스
    - 포인터 : 할당 자원 및 프로세스의 데이터와 명령어를 가리키는 포인터
    - 실행 문맥 : 프로세스가 마지막으로 실행한 레지스터 내용

이런 프로세스가 여러개 실행되는 환경을 우리는 멀티프로세스(Multi-Process)라 부른다

2. 멀티 프로세스(Multi-Process)

위의 캡쳐에서 보이듯 우리는 동시에 여러개의 프로세스를 실행하고 있는 것을 볼 수 있다. 하지만 꼭 알아야 하는 것이 (코어를 하나라 가정) 컴퓨터는 한번에 하나의 명령만을 처리한다. 즉 동시에 실행한다는 것이 컴퓨터의 작동방식과 모순 된다는 것이다. 이를 OS 는 컨텍스트 스위칭 (Context-Switching) 을 통해 해결한다. 아래에서 보자

동시성 이슈에 있어 중요한건 사실 '컴퓨터는 동시에 처리하지 않는다' 는 것이다. 하지만 동시에 실행되는 것처럼 속일 수는 있다. 즉 한번에 여러개의 프로세스를 번갈아 처리함으로써 여러 프로세스가 동시에 작동하는 척 할 수 있다는 것이다.

이는 각 프로세스가 CPU 에 각자의 정보를 담은 PCB를 번갈아서 넣었다 뺐다를 반복하여 각 프로그램이 유지될 수 있게 하는 것이다. (이 과정을 컨텍스트 스위칭 이라 부른다.)

이 과정에서 메인 메모리와 CPU 사이에서 캐시를 통해 데이터를 주고 받게 되는데, 멀티 프로세스의 경우 각 프로세스가 공유하는 자원이 없기 때문에 캐시를 꾸준히 통채로 비웠다 넣었다 하는 작업을 반복해야해서 자원소모가 커진다.

듣기만해도 무거운 이 작업을 경량화 시키기 위한 세분화 시킨 작업단위가 스레드 이다.

3.  스레드 & 멀티스레드

프로세스의 무거운(?) 작업을 해결한 방법은 프로세스 내부의 작업을 여러개의 스레드로 나누어 작업함으로써 해결한다. 내부의 스레드는 부모 프로세스로부터 코드, 데이터, 힙영역의 리소스를 공유자원으로서 이용하고 각각의 스택에서 개별 작업을 하여 전체 작동을 수행하게 된다.

이때 멀티스레드에서는 멀티프로세스와 달리 공유자원이 차고 넘치므로 캐시를 비우는 작업이 가벼워진다. 즉 컨텍스트 스위칭이 무겁지 않게 진행이 된다는거다. 다만 공유자원을 활용 하기에 공유 자원의 동기화 작업을 반드시 신경써 주어야 한다.

오해하지 말아야 할 것이 있다면, 절대 '멀티 스레드는 멀티 프로세스 보다 상위 호환의 작업 방식이다' 는 것이 아니다. 멀티 스레드는 각 스레드 간이 긴밀하게 연결이 되어 있기 때문에 한 스레드의 문제가 전체 스레드에 영향을 미칠 수 있다. 즉 멀티 스레드와 멀티 프로세스는 '다른' 작업 방식이자 다른 작업 단위를 사용하는 작업 방식임을 꼭 염두해두어야 한다.

post-custom-banner

0개의 댓글