Skip to content

Latest commit

 

History

History
88 lines (51 loc) · 10.7 KB

File metadata and controls

88 lines (51 loc) · 10.7 KB

멀티 프로세스와 멀티 스레드

멀티 프로세스

멀티 프로세스는 하나의 프로그램에서 여러 개의 프로세스를 실행할 수 있게 하는 기술이다. 멀티 프로세스 구조에는 부모 프로세스와 자식 프로세스가 존재한다. 부모 프로세스는 자식 프로세스를 생성하고 관리할 수 있다. 프로세스는 자신만의 Id를 가지는데, 이를 PID(Process Id)라고 한다. 부모 프로세스는 자식 프로세스의 PID를 알고 있어 자식 프로세스를 관리할 수 있고, 자식 프로세스도 부모 프로세스의 PPID를 알고 있어 부모 프로세스와 통신할 수 있다.

부모 프로세스와 자식 프로세스는 통신할 수 있지만 서로 다른 프로세스이기 때문에 독립적으로 실행되며, 메모리 공간 또한 각각 독립적으로 가진다.

크롬 같은 웹 브라우저의 탭이 멀티 프로세스의 예시이다. 각각의 탭은 독립적인 프로세스이기 때문에 한 탭이 멈춰도 다른 탭은 정상 작동한다.

멀티 프로세스의 장점

1. 프로그램 안정성

멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가진다. 따라서 한 프로세스가 비정상적으로 종료되어도 다른 프로세스는 정상적으로 작동한다. 그래서 멀티 프로세스를 사용하면 프로그램 전체의 안정성을 확보할 수 있다.

2. 프로그램 병렬성

멀티 프로세스와 여러 개의 CPU 코어를 사용하면 각 프로세스를 병렬적으로 실행해 성능을 향상시킬 수 있다. 하지만 이는 멀티 스레드도 가지는 장점이다.

3. 시스템 확장성

멀티 프로세스는 각 프로세스가 독립적이기 때문에 이를 이용해 시스템을 쉽게 확장할 수 있다. 서버를 개발할 때 수많은 요청을 처리하기 위해 여러 대의 서버를 두고 클라이언트 요청을 분산시키기도 한다. 이는 컴퓨터를 많이 설치하는 방식과, 성능이 좋은 컴퓨터에 여러 프로세스를 두는 방식으로 볼 수 있다. 멀티 프로세스는 이 중 여러 프로세스를 두는 쪽이라고 할 수 있다.

멀티 프로세스의 단점

1. Context Switching Overhead

멀티태스킹을 할 때 특정 작업에서 다른 작업으로 이동하는 과정을 Context Switching이라고 한다. 멀티 프로세스는 Context Switching 과정에서 성능 저하가 발생할 수 있다. 프로세스를 컨텍스트 스위칭하려면 CPU는 다음 프로세스의 정보를 가져오기 위해 메모리를 검색하고, 캐시를 초기화하는 과정을 거쳐야 한다. 이로 인해 오버헤드가 발생할 수 있다.

2. 자원 공유 비효율성

멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가지기 때문에 메모리 사용량이 증가한다. 또한 각 프로세스가 정보를 공유하려면 복잡한 통신 기법인 IPC를 사용해야 한다. IPC란 프로세스 간에 정보를 주고받는 메커니즘을 말한다. 이 과정에서 데이터를 복사하거나 버퍼링하므로 오버헤드가 발생하고, 코드도 복잡해진다.

멀티 스레드

스레드는 하나의 프로세스 안에 있는 실행 흐름이다. 멀티 스레드는 이러한 스레드가 하나의 프로세스 안에 여러 개 존재하도록 하는 기술이다. 웹 브라우저에서도 멀티 스레드를 사용하는데, 하나의 탭 안에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업 등을 각 스레드로 처리한다.

멀티 스레드의 장점

1. 스레드는 프로세스보다 가볍다

스레드는 프로세스 안에서 생성되기 때문에 실행 환경을 설정하는 작업이 매우 간단하고, 생성 및 종료도 빠르다. 또한 스레드는 코드, 데이터, 스택 영역을 제외한 영역을 공유하므로 내장된 데이터 용량이 프로세스보다 작다.

2. 자원의 효율성

스레드는 프로세스와 달리 head 영역에 있는 데이터를 공유할 수 있다. 그렇기 때문에 IPC를 사용하지 않아도 되며, 시스템 자원 소모가 줄어든다.

3. Context Switching 비용 감소

스레드에서도 Context Switching 오버헤드는 존재하지만, 프로세스의 오버헤드보다는 훨씬 적은 편이다. 프로세스는 Context Switching을 하기 위해 CPU 캐시를 초기화하고, 메모리에서 다음 프로세스의 정보를 검색해야 한다. 하지만 스레드는 스레드 간 공유 자원을 제외한 스레드 정보(stack, register)만 교체하면 되기 때문에 Context Switching 비용이 상대적으로 낮다.

4. 응답시간 단축

멀티 스레드는 위에서 설명한 장점을 가지며, 여러 개의 스레드가 하나의 프로세스 내에서 요청을 처리할 수 있기 때문에 빠른 응답 시간을 보장할 수 있다.

멀티 스레드의 단점

1. 안정성 문제

멀티 프로세스에서는 프로세스가 각각 독립되어 있기 때문에 한 개의 프로세스가 멈추더라도 나머지 프로세스는 정상 작동한다. 하지만 멀티 스레드에서는 하나의 스레드에서 문제가 발생하면 다른 스레드도 함께 멈출 수 있다. 따라서 개발자는 적절한 예외 처리를 해두어야 한다.

2. 동기화로 인한 성능 저하

스레드는 자원을 공유해 사용하기 때문에 여러 스레드가 동시에 하나의 데이터에 접근할 수 있다. 그러면 두 개의 스레드가 동시에 자원을 바꾸는 문제가 생길 수 있으므로, 동기화를 통해 한 번에 하나의 스레드만 자원에 접근할 수 있도록 통제해야 한다. 그러나 동기화 작업은 여러 스레드의 접근을 제한하는 것이기 때문에 병목 현상이 발생한다.

3. 데드락

데드락이란 다수의 프로세스나 스레드가 서로 자원을 점유한 채, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 교착 상태를 말한다. 여러 개의 스레드가 서로를 기다리며 무한 대기에 빠지는 현상과 비슷하다고 보면 된다. 위 이미지처럼 다수의 스레드가 같은 lock을 동시에, 혹은 서로 다른 명령에 의해 획득하려고 할 때 서로 절대 일어날 수 없는 일을 계속 기다리는 상황을 말한다. 이러한 문제를 해결하기 위해서는 상호배제, 점유와 대기, 비선점, 순환 대기 등의 조건을 고려하며 극복해야 한다. 데드락은 멀티 스레드만의 단점이 아니라, 멀티 프로세스와 멀티 스레드의 공통된 단점이다. 프로세스 또한 IPC로 메모리를 공유하기 때문이다.

4. Context Switching Overhead

멀티 스레드의 Context Switching이 멀티 프로세스보다 가볍다고 해도, 오버헤드 비용을 완전히 무시할 수는 없다. 특히 스레드 수가 많을수록 Context Switching이 자주 발생하고, 이는 성능 저하로 이어진다. 그렇기 때문에 "스레드가 많을수록 무조건 좋을까?"라는 질문에는 Context Switching Overhead를 알고 있는 우리가 조금 더 신중하게 답해야 할지도 모르겠다.