멀티프로세싱(multiprocessing)과 멀티스레딩(multithreading)의 차이점 [ 운영체제(OS) 면접질문 2]
why
OS 관련 단골 질문 중 하나이다. 프로세스와 스레드의 차이점을 물어본 후에 깊게 들어올 수 있는 질문이라고 생각한다.
둘 다 컴퓨팅의 효율성을 위한 기법[병렬 처리]이다.
멀티 프로세싱은 OS의 관점에서 프로세스를 여러개 운영하는 방법이고
멀티 스레딩은 하나의 프로세스에서 내부 기능을 동시에 실행시키는 방법이다.
현대의 하드웨어는 다중 CPU, 다중 코어를 지원하기에 병렬 처리와 관련된 지식은 상당히 중요하다.
배경
면접질문1에서는 스레드와 프로세스의 차이점을 살펴보았다. 스레드는 프로세스에 속하는 단위로 프로세스는 하나이상의 스레드를 소유한다. 그리고 CPU는 스레드 단위로 작업을 처리한다.
현대의 프로그램은 많은 기능들을 제공해줘야 한다. 네트워크를 사용하고, 하드디스크에서 파일을 읽어오고,
데이터베이스를 처리해야 하며, 모니터로 시각자료들을 출력해줘야 한다. 동시에 다양한 입력장치를 처리해줘야 한다.
IO 관련 작업이 상당히 많아지게 되었다. IO 작업의 경우 CPU와는 거리가 먼 하드웨어 자원들(메모리, 하드디스크,
네트워크를 통한 다른 호스트 PC)를 사용하게 되기에 IO작업으로 막히는 시간은 전체 처리과정에서 보면 상당히 아까운 시간들이다.
CPU의 처리속도는 IO처리 속도에 비하면 상당히 빠르기 때문이다.
그래서 CPU가 작동하면서 IO를 병렬적으로 처리할 수 있게 만든다면 프로그램의 효율성을 상당히 높일 수 있게 된다.
그래서 멀티스레딩이 상당히 중요한 키워드로 떠오르게 된다.
멀티 프로세싱은 프로세스를 여러 개 실행할 수 있는 환경을 제공하는 것이다. [ 다중 코어를 활용 ]
멀티 스레딩은 하나의 프로세스를 여러 개의 스레드로 처리하여 프로세스를 효율적으로 실행하는 것을 의미한다.
OS는 둘을 잘 활용해서 컴퓨터로 할 수 있는 사용자 경험의 폭을 넓혀준다.
컴퓨터에서는 수많은 프로세스가 작동한다. [ 멀티 프로세싱 ]
그리고 하나의 프로세스는 많은 기능을 제공한다. [ 멀티 스레딩 ]
멀티 프로세싱(MultiProcessing) [ OS의 관점 ]
컴퓨터 시스템에서 1개 이상의 프로세스가 동시적으로 실행가능하다는 것을 의미한다.
여러 개의 프로세스 유닛(CPU)을 가진 하드웨어에서 활용 가능하다. 다수의 프로세서로 다수의 "프로세스"를 협력적으로 동시에 처리하는 것이다.
fork()를 통해 자식 프로세스를 생성하는데, 생성된 프로세스는 자신만의 메모리 영역(Heap, Stack, Code, Data)을
소유한다.
프로세스끼리 독립되기에 프로세스 사이에서 공유할 자원이 있다면 프로세스 간 통신 메커니즘(Inter Process Communication : IPC)을 활용해야 한다.
위의 그림을 보면 각각의 CPU는 자신만의 레지스터와 메모리를 소유하고 있다.
특징
1. 멀티 프로세싱을 사용하면 프로세스를 독립적으로 운영할 수 있어 시스템의 안정성을 높일 수 있다.
2. 병렬적으로 처리 가능한 작업으로 분해하여 성능을 향상시킬 수 있다.
멀티스레딩(MultiThreading) [ 프로세스 처리의 관점 ]
하나의 프로세스 안에 여러 개의 실행 흐름(스레드)를 두는 방식으로 여러 실행을 동시에 실행하도록 하나의 프로세스를 운영하는 방식이다.
- 소프트웨어적인 기법으로 프로세스를 작은 단위의 스레드로 분할하여 운영하기에 반드시 다중 CPU가 지원될 필요는 없다. [ 파이프라인 기법으로 구현 ]
프로세스 내에서 데이터, 힙, 코드 영역을 공유하기 때문에 자원의 관점과 문맥 교환 관점에서 멀티프로세싱 방법보다
효율적이다.
[ 데이터, 힙, 공유 라이브러리, 코드 영역은 커널 Context로 관리하며, 별도의 기능으로 전환(Program Counter)되어야 하는 영역(Stack)은 스레드별로 소유한다. ]
장점
1. 작업 효율성
- 하나의 프로세스에서 여러 스레드를 병렬적으로 수행하기에 작업의 효율성이 높다.
EX. 입출력 처리 부분과 CPU 처리 부분을 스레드로 나누어 처리하는 방식
2. 응답성 향상
- 다른 스레드가 작업을 계속 수행하면서 입출력 스레드를 진행시킬 수 있어 사용자의 작업 요구에 빠르게 응답이 가능하다.
3. 자원 공유
- 독립적인 스레드는 레지스터와 스택 메모리 영역을 가지면 된다. 그 외의 필요한 정보는 프로세스의 데이터, 코드, 힙 영역을 공유하면 된다. 이는 불필요한 자원의 중복을 막아주며 시스템의 효율을 높여준다.
멀티 프로세싱 vs 멀티 스레딩의 예시 [ 쉽게 배우는 운영체제 참고 ]
인터넷 익스플로러는 멀티 스레딩 기법으로 브라우저를 실행시켰다. 자원의 효율성을 높여주는 장점이 있지만 단점은
스레드에서 생긴 문제가 프로세스 전체에 영향을 미친다는 점이다.
[ 과거 IE를 사용한 분들은 이를 경험해 봤을 것이다. 하나의 탭이 멈추는데 해당 브라우저 전체를 꺼야 했다. ]
반면 크롬의 경우 멀티 프로세싱 방식으로 브라우저를 운영한다.
즉 하나의 탭은 하나의 프로세스인 셈이다. 그래서 탭 하나에 문제가 생겨도 다른 탭에는 영향을 주지 않는다.
멀티코어 CPU가 대중화되면서 여러 개의 프로세스를 여러 개의 CPU에서 동시에 실행할 수 있는 환경이 되면서
멀티 프로세싱을 활용해도 크게 문제가 되지 않는 것이다. [ 대신 자원을 어마 무시하게 잡아먹는다. ]
둘의 차이점 [ 작업 간의 통신 ]
프로세스는 독립된 환경에서 실행되기에 프로세스 간에 공유해야 할 데이터가 생기면 프로세스 사이의 통신을
구축해줘야 한다. 이를 IPC라고 부른다.
공유 메모리를 두거나, 파일, 파이프 등등 프로세스 간의 통신을 위한 기술로 프로세스끼리 통신해야 한다.
[ IPC를 유지하는 비용과 프로세스를 전환하는 비용이 멀티 프로세싱의 단점이다. ]
반면 스레드의 경우 프로세스의 데이터와 코드, 힙을 공유하다 보니 작업(스레드) 사이에 통신 메커니즘을 구축할 필요가 없다. 바로 공유하고 있는 데이터를 참조하면 그만이다.
개인적인 마무리
멀티 프로세싱은 OS의 관점에서 여러 개의 프로세스를 효율적으로 운영하기 위해 하드웨어 자원을 사용하는 방법이다.
독립적인 프로세스 덕에 안정성을 가지지만 문맥 교환에 대한 비용이 그만큼 크다.
[ 작업량이 많을수록 오버헤드가 상당하다 ]
반면 멀티 스레딩은 단일 프로세스를 효율적으로 실행시키기 위한 방법이다.
프로세스 내부에서 처리할 작업들을 스레드로 나누어서 병렬적으로 처리되도록 하는 것이다.
[ 단일 CPU 자원을 효율적으로 쓰는 것이다. ]
멀티 스레딩의 경우 공유할 수 있는 자원을 공유하는 구조이다 보니 자원의 효율성과 문맥 교환의 효율성이 크지만
단일 스레드의 문제가 프로세스 전체에 영향을 줄 수 있는 치명적인 부분이 있다.