이번 글에서는 멀티 프로세스와 멀티 스레드를 비교해보록 하겠습니다. 두 개념 모두 "멀티(multi)"가 붙는다는 공통점이 있어 헷갈리는 개념이기도 합니다. "멀티(multi, 다수의)" 를 뗀 "프로세스(process)"와 "쓰레드(thread)"에 대해 먼저 정리해보겠습니다.
프로세스란 무엇일까요?
실행중인 프로그램을 프로세스라고 합니다. 다시 말해 보조기억장치에 저장되어 있던 프로그램이 실행 되기 위해서 메모리에 적재되는 순간 프로세스가 됩니다. 이러한 과정을 프로세스가 생성된다라고 표현합니다.
프로세스는 나뉘어서 메모리에 적재됩니다.
메모리에는 커널 영역과 사용자 영역이 있습니다.
커널 영역에는 프로세스 생성시 PCB(Process Control Block)이라는 프로세스와 관련된 정보들이 담긴 것이 생성됩니다.
사용자 영역에는 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다.
코드 영역(=텍스트 영역)에는 실행할 수 있는 코드 즉, 기계어로 이루어진 명령어가 저장됩니다. (read-only)
데이터 영역에는 프로그램이 실행되는 동안 유지할 데이터가 저장됩니다. 예를 들어 전역변수가 있습니다.
힙 영역은 프로그래머가 직접 할당할 수 있는 저장 공간입니다. 해당 영역에 메모리를 할당했다면, 언젠가는 할당된 공간을 반환해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.
스택 영역은 프로그램이 실행되는 동안 데이터를 일시적으로 저장하는 공간입니다. 예를 들어 매개 변수, 지역 변수가 저장됩니다.
코드 영역과 데이터 영역은 크기가 고정된 영역인 정적 할당 영역입니다. 힙 영역과 스택 영역은 크기가 변동되는 동적 할당 영역입니다. 이 둘은 충돌을 방지하기 위해서 주로 힙영역은 메모리의 낮은 주소부터 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당됩니다.
스레드란 무엇일까요?
프로세스를 구성하는 실행 단위 입니다. 프로세스는 하나의 스레드로 이루어질 수 있으며 이를 단일 스레드라고 합니다. 그리고 여러개의 스레드로 이루어져 여러 명령어를 동시에 실행하는 것을 멀티 스레드라고 합니다.
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터값, 스택으로 구성됩니다. 하지만, 동일한 프로세스에서 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한채 프로세스 자원을 공유하며 실행한다.
멀티 스레드와 멀티 프로세스란?
멀티 프로세스는 하나의 응용 프로그램에 대해 여러 개의 프로세스를 실행할 수 있는 기술입니다. 멀티 프로세스의 내부를 보면, 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로서 다중 프로세스를 구성하는 구조입니다.
멀티 스레드는 하나의 프로세스 안에 여러개의 스레드가 있는 것을 말합니다. 따라서 하나의 프로그램에서 두가지 이상의 동작을 동시에 처리하도록 하는 행위가 가능합니다.
동일한 작업을 수행하는 단일 스레드 프로세스 여러 개를 수행하는 것과 하나의 프로세스를 여러 스레드로 실행하는 것은 무엇이 다를까요?
결과는 동일할 수 있습니다. 하지만, 그 내용이 다릅니다.
멀티 프로세스는 기본적으로 자원을 공유하지 않습니다.
멀티 스레드에서는 스레드끼리 같은 프로세스 내의 자원을 공유합니다.
이러한 차이로 다음과 같은 영향이 있습니다.
1. 멀티 프로세스는 메모리 사용량이 증가하게 됩니다.
만일 같은 프로세스 간의 자원 공유가 필요한 경우 프로세스 사이의 어렵고 복잡한 통신인 IPC 를 사용해야 합니다. 반면, 멀티 스레드는 IPC 를 사용하지 않고도 데이터를 공유하기 때문에 자원이 효율적으로 활용이 가능해 시스템 자원 소모가 줄어듭니다.
2. 멀티 프로세스는 멀티 스레드보다 문맥교환 오버헤드가 올 수 있습니다.
멀티 프로세스는 문맥 교환을 할 때 다음 프로세의 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터까지 준비해야 하기 때문에 오버헤드가 발생할 수 있으며, 스레드는 상대적으로 가볍습니다.
3. 멀티 스레드 환경에서 하나의 스레드 문제가 생기면, 프로세스 전체에 문제가 생길 수 있습니다.
반면, 멀티 프로세스 환경은 독립적이기 때문에 비교적 안정합니다.
[참고]