들어가기 앞서...
멀티 프로세스와 멀티 스레드에 대하여 공부하기 전 프로세스와 스레드를 알고 가는 것이 중요하다. 만약 궁금하다면 해당 블로그를 먼저 보고 오자
https://latewalk.tistory.com/173
💻 프로세스와 스레드
💬 프로세스 프로세스의 사전적 의미로는 "컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램"이라는 의미로 프로그램의 실행 상태이자, 메모리 공간에 할당된 실체이다. 각 프로세스는
latewalk.tistory.com
멀티 프로세스
멀티 프로세스는 운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술이다. 일반적으로 하나의 프로그램을 실행하면 하나의 프로세스가 생성되고 그에 대한 메모리가 할당되지만, 부가적인 기능을 위해서 여러개의 프로세스를 생성하는 것이다.
내부
멀티 프로세스의 내부를 보면, 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로서 다중 프로세스를 구성하는 구조이다. 이때 다른 프로세스를 생성하는 역할을 하는 프로세스를 부모 프로세스라고 하고 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스 라고 한다. 다시 말하지만 그렇다고 부모 프로세스가 메모리를 할당 받지 않는 것은 아니다.
부모 프로세스와 자식 프로세스는 각각의 고유한 PID를 가지고 있다. 부모 프로세스는 자식 프로세스의 PID를 알고 있다. 이를 통해 자식 프로세스를 제어하고 자식 프로세스는 부모 프로세스의 PID와 PPID를 알고있기 때문에 통신이 가능하다.
다만! 통신이 가능하지 부모 프로세스와 자식 프로세스는 엄연히 서로 다른 프로세스로 독립적으로 실행되며, 독립적인 메모리 공간을 가지고 있어 서로 다른 작업을 수행하게 된다. 대표적인 예로 구글의 탭(Tab)능력이다. 각각의 탭은 다른 사이트를 띄우지만 결국 같은 브라우저(Chrome)이기 때문이다.
장점
1. 프로그램의 안정성(독립적인 메모리 공간)
멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가지고 있다. 한 프로세스가 비정상적으로 종료되어도 다른 프로세스에는 영향이 가지 않는다. 그래서 해당 프로그램의 안전성을 확보 할 수 있다
이는 또다시 브라우저의 탭을 통해 예로 들 수 있는데 우리가 여러곳의 탭 중 하나의 사이트가 먹통이 되었다고 다른 탭이 작동이 불가능 한것은 아니다. 이유는 부모 프로세스에서 나온 자식 프로세스는 별도의 메모리로 관리가 되기 때문이다.
2. 시스템 확장성
멀티 프로세스는 각 프로세스가 독립적이다 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향을 주지 않기 때문에 시스템의 규모를 보다 쉽게 확장할 수 있다는 것이다.
이 부분에 대해서는 서버를 예로 들어보는 것이 적절하다
대규모 웹 서비스에서는 수많은 요청을 동시에 처리하기위해 여러대의 서버를 두고 로드 밸런서와 같은 장비를 사용해서 클라이언트 요청 트래픽을 분산 시킨다. 이떄 여러대의 서버는 여러개의 컴퓨터 or 성능이 좋은 컴퓨터에 여러개의 서버 프로세스를 두는 것을 말한다. 여기서 멀티 프로세스는 성능이 좋은 컴퓨터를 뜻한다.
이렇게 하나의 컴퓨터에 여러개의 서버 프로세스를 띄우면서 요청을 분산시켜 처리하면서 시스템의 규모를 쉽게 확장할 수 있으며, 부가로 서버의 장애나 다운 타임을 최소화 할 수 있게 되는 것이다.
단점
1. Context Switching Overhead
멀티 프로세스, 멀티 스레드를 구성하는 핵심 기술인 컨텍스트 스위칭은 그 과정에서 성능 저하가 올 수 있다. 특히나 프로세스를 컨텍스트 스위칭 하면 CPU는 다음 프로세스의 정보를 불러오기 위해 메모리를 검색하고 CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비해야 하기 떄문에 빈번한 Context Swtiching이 일어나고 이로 인해 비용 오버헤드가 발생 할 수 있다.
따라서 멀티 프로세스는 Context Swtiching 작업을 최소화하는 것이 중요하다.
- 프로세스 수를 적정하게 유지
- I/O 바운드 작업이 많은 프로세스와 CPU 바운드 작업이 많은 프로세스는 따로 관리
- CPU 캐시를 효율적으로 활용
이러한 방법을 사용할 수 있다.
2. 자원 공유 비효율성
멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가지므로, 이는 메모리 사용량을 증가를 초래한다.
만일 각 프로세스간에 자원 공유가 필요할 경우 프로세스 사이의 어렵고 복잡한 통신 기법인 IPC를 사용해야 한다
IPC란
운영체제 상에서 실행중인 프로세스 간에 정보를 주고받는 메커니즘을 말한다. 이를 위해 파이프, 소켓, 메세지 큐 등 다양한 방법이 사용된다. 하지만 IPC 자체로 오버헤드가 발생하게 된다. IPC 기법은 데이터를 복사하거나 버퍼링하는 과정에서 성능 저하가 발생할 수 있기 때문이다. 나아가 코드의 복잡도까지 증가시키게 된다
멀티 스레드
Thread는 하나의 프로세스 내에 있는 흐름이다. 그리고 멀티 스레드는 하나의 프로세스 안에 여러 개의 스레드가 있는 것을 말한다. 따라서 하나의 프로그램에서 두가지 이상의 동작을 동시에 처리하도록 하는 행위가 가능해진다.
웹 서버는 대표적인 멀티 스레드 응용 프로그램이다. 사용자가 서버 데이터베이스에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있는 이유도 바로 멀티 스레드 덕분이다. 즉, 하나의 스레드가 지연되더라도, 다른 스레드는 작업을 지속할 수 있게 된다
웹 브라우저에서 여러 탭이나 여러 창이 멀티 프로세스를 대표하는 것이였다면 멀티 스레드는 웹 브라우저의 단일 탭 또는 창 내에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리 하고 처리하는데 사용된다
장점
1. 스레드는 프로세스보다 가벼움
스레드는 프로세스보다 용량이 가볍다. 스레드는 프로세스 내에서 생성되기 때문에 스레드의 실행 환경을 설정하는 작업이 매우 간단하다. 또한 스레드는 프로세스와 달리 Code, Data, Heap을 제외한 나머지 자원을 서로 공유하기 떄문에 기본적으로 내장되어 있는 데이터 용향이 프로세스보다 작다. 때문에 프로세스 내부의 자원만을 관리하면 되기 때문에 프로세스 생성, 제거보다 훨씬 빠른 것이다.
2. 자원의 효율성
멀티 스레드는 하나의 프로세스 내에서 여러 개의 스레드를 생성하기 때문에, heap 영역과 같은 공유 메모리에 대해 스레드 간에 자원을 공유가 가능하다. 이를 통해 프로세스 간 통신(IPC)를 사용하지 않고도 데이터를 공유할 수 있기 때문에, 자원의 효율적인 활용이 가능해 시스템 자원 소모가 줄어든다.
3. Context Switching 비용 감소
프로세스처럼 스레드에도 Context Switching 오버헤드가 존재하지만 비용이 훨씬 적다.
프로세스 컨텍스트는 스위칭을 할때마다 CPU 캐시에 있는 내용을 모두 초기화하기 때문에 높은 비용이 드는 반면, 스레드 컨텍스트 스위칭은 스위칭할 떄 스레드 간에 공유하는 자원을 제외한 스레드 정보만을 교체하면 되므로 프로세스 컨텍스트 스위칭 비용보다 상대적으로 낮은 것이다.
단점
1. 안정성 문제
멀티 프로세스 모델에서는 각 프로세스가 독립적으로 동작하므로 하나의 프로세스에서 문제가 발생해도 다른 프로세스들은 영향을 받지 않기 떄문에 프로그램이 죽지 않고 계속 동작할 수 있다. 그러나 멀티 스레드 모델에서는 기본적으로 하나의 스레드에서 문제가 발생하면 다른 스레드들도 영향을 받아 전체 프로그램이 종료 될 수 있다.
이를 극복하려면 스레드 에러 발생을 대비하여 예외 처리를 잘 해놓는다던가, 에러 발생 시 새로운 스레드를 생성하거나 스레드 풀에서 잔여 스레드를 가져오던지 하여 프로그램 종료를 방지 할 수 있다.
2. 동기화로 인한 성능 저하
멀티 스레드는 여러 개의 스레드가 공유 자원에 동시에 접근이 가능하기 때문에, 동기화 문제가 발생할 수 있다. 예를 들어 여러 스레드가 동시에 한 자원을 변경해 버린다면 의도되지 않은 엉뚱한 값을 읽어 서비스에 치명적인 버그가 생길수도 있다. 따라서 스레드 간 동기화는 데이터 접근을 제어하기 위한 필수적인 기술이다.
동기화 작업은 여러 스레드들이 자원에 대한 접근을 순차적으로 통제하는 것이다. 그러면 동시 접근으로 인한 동시 수정과 같은 현상은 일어나지 않게 된다. 그러나 동기화 작업은 여러 스레드 접근을 제한하는 것이기 때뭉네 병목 현상이 일어나 성능이 저하될 가능성이 높다는 단점이 있다.
이를 해결하기 위해 임계영역에 대하여 뮤텍스, 세마포어 방식을 사용한다
임계영역(Critical Section)
멀티 스레드 프로그래밍에서 임계 영역은 공유 자원을 접근하는 코드 영역을 말한다. 대표적으로 전역 변수나 Heap 메모리 영역을 들 수 있다.
뮤텍스(Mutex)
공유 자원에 대한 접근을 제어하기 위한 상호 배제 기법 중 하나로, 임계 영역에 진입하기 전에 락을 획득하고, 임계 영역을 빠져나올때 락을 해제하여 다른 스레드들이 접근할 수 있도록 한다. 즉, 오직 1개의 스레드만이 공유 자원에 접근할 수 있도록 제어하는 기법이다.
세마포어(Semaphore)
동시에 접근 가능한 스레드의 갯수를 지정할 수 있다. 세마포어 값이 1이면 뮤텍스와 동일한 역할을 하게 되며, 값이 2 이상이면 동시에 접근 가능한 스레드의 수를 제어 할 수 있다. 스레드가 임계 영역에 진입하기 전에 세마포어 값을 확인하고, 값이 허용된 범위 내에 있을때만 락을 획득할 수 있는 형식이다.
3. 데드락(교착 상태)
데드락이란, 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 교착 상태를 말한다. 여러개의 스레드가 무한정으로 대기하게 되면서 생기는 증상이다.
이러한 현상은 스레드의 특징인 공유 자원에 대한 동시 액세스로 인한 문제로, 이를 방지하기 위한 방법으로 상호배제, 점유와 대기, 비선점, 순환대기등의 방법으로 극복해야 한다.
이는 멀티 스레드만의 문제가 아닌 프로세스에도 포함되는 공통적인 문제점이기도 하다. 프로세스는 기본적으로 독립적인 메모리 공간이지만 IPC를 통해 자원을 공유하기 때문에 똑같이 교착상태에 빠질 수 있는 가능성이 존재한다.
'CS' 카테고리의 다른 글
프레임 워크와 라이브러리의 차이 (0) | 2024.05.22 |
---|---|
🎯 Redis (1) | 2024.04.26 |
DNS(Domain Name System) (0) | 2023.05.03 |
HTTP(3). 성능향상 (0) | 2023.05.01 |
Cookie와 Session (4) | 2023.05.01 |