※ 이 글을 작성하기 전에 본인은 이 분야의 전문성을 가진 전문가가 아님을 미리 밝힙니다. ※


#1. 멀티 프로세스와 멀티 쓰레드

멀티 프로세스는 말 그대로 여러개의 프로세스를 생성해서 이를 이용해 하나의 작업을 병렬적으로 처리하는 과정을 의미하고

멀티 쓰레드 라는 것은 하나의 프로세스 내에서 여러 개의 쓰레드를 생성함으로써 이를 이용해 작업을 처리하는 과정을 의미한다.

이 둘의 공통점으로는 여러개의 작업을 동시에 혹은 병렬적으로 처리함으로써 작업속도를 높일 수 있다는 점이 있다.


#2. 멀티 쓰레드가 필요한 이유

그런데 ! 멀티 프로세스든 멀티 쓰레드든 여러 개의 작업을 빠른 속도로 처리할 수 있다면 굳이 쓰레드를 만들어서 사용할 필요가 있을까 ?? 그냥 프로세스를 무조건 여러개 만들어서 사용하면 되지 않을까 ??

그럼 Process를 여러개 만든 멀티 프로세스의 경우를 한번 생각해보자.


#2 - 1. 멀티 프로세스에서 발생할 수 있는 문제점

1. 너무 잦은 Context Switching

CPU는 한 번에 한 개의 Process만 처리가 가능하다. 우리 눈에는 여러 개의 작업이 동시에 실행되는 것 처럼 보일지 몰라도 CPU는 계속해서 특정 업무를 처리하는 Process들을 바꿔주는 일을 내부적으로 진행하고 있다.

즉 ! 이렇게 현재 진행중이던 Process의 지금까지의 연산결과, 혹은 어디까지 진행되었는지 이러한 정보들을 PCB에 저장하고, 이제 실행되려는 Process에게 CPU를 할당해 주어야 한다.

이렇게 하나의 Process에 대한 정보들을 저장해 놓고, 새로운 Process에 대한 정보를 가져오고 메모리를 할당해주는 이러한 과정을 'Context Switching(문맥교환)' 이라고 한다.

이 문맥교환이 이뤄지기 위해서는 운영체제에서 프로세스들의 정보를 관리하고 있는 PCB에 접근해야 하고 이 과정을 위해서 'System Call' 이라고 불리는 절차를 진행하게 된다.

즉 ! Multi - Process로 진행하게 될 경우, 이러한 Context Switching이 자주 일어나게 될 것이다. 그런데 문제점은 Context Switching 동안(정보를 저장하고 새로운 정보를 설정하는 동안)에는 CPU는 아무런 작업도 하지 못하게 된다.

따라서 이러한 Context Switching이 너무 자주 일어나게 되면 오버헤드가 발생할 수 있고 CPU의 성능 또한 저하될 수 있다.

2. 프로세스 간의 통신

작업을 진행하던 도중 Process들끼리 서로의 자원을 사용하고 싶은 경우를 생각해보자.

이 경우에는 Process 간의 통신을 진행하면 된다. 이 때 IPC(Inter - Process Communication)를 이용하게 되는데

이는 비용적으로 많은 부담이 든다고 한다.

3. 많은 메모리 공간

프로세스는 실행될 때 마다 각각에 고유한 메모리 영역을 할당해 주어야 하기 때문에 프로세스가 많으면 많아질수록

더 많은 메모리 공간을 차지하게 된다.


이렇게 멀티 프로세스를 만들어서 작업을 수행할 경우 위와 같은 문제점들이 존재한다.

따라서 이러한 문제점들을 해결하기 위해서 멀티 쓰레드를 만들어서 사용하는 것이 좋다.

그럼 멀티 쓰레드를 만들어서 작업을 수행하게 되면 위의 문제들이 어떻게 해결되는지 알아보자.


#3. 멀티 쓰레드의 장점

1. 적은 메모리 공간

먼저 하나의 프로세스 내에서 메모리 공간을 공유하는 형태로 존재하는 쓰레드이기 때문에 메모리 공간을 멀티 프로세스에 비해서 적게 차지한다는 장점이 있다. 또한 이러한 점 때문에 시스템의 자원 소모를 절약할 수 있다는 장점도 존재한다.

2. 쓰레드 간의 통신

쓰레드는 이전 글(프로세스와 쓰레드)에서 쓰레드는 메모리 공간을 공유한다고 했었다.

즉 ! 별도의 통신 방법 혹은 별도의 자원을 이용해서 쓰레드 간의 통신을 진행하는 것이 아니라, 공유하고 있는 메모리 영역인

Code , Data , Heap 영역을 통해서 데이터를 주고 받을 수 있다. 따라서 통신에 대한 방법도 훨씬 간단하고 그 비용도 훨씬

절약할 수 있다는 장점이 있다.

3. Context Switching

쓰레드의 문맥교환은 프로세스의 문맥교환과 달리 Cache Memory를 비울 필요가 없기 때문에 속도면에서 훨씬 더 빠르고 CPU의 부담도 훨씬 덜 가게 된다. 이러한 점 때문에 시스템의 처리율이 향상되고 프로그램의 응답시간이 단축되어 진다.


#4. 멀티 쓰레드의 단점 및 문제점

그렇다면 무조건 멀티 쓰레드를 만들어서 사용하는 것이 좋은 것일까 ??

멀티 쓰레드에도 단점이 존재한다.

1. 독립적이지 않은 구조

쓰레드들은 프로세스와 달리 서로 독립적인 구조로 이루어져 있지 않다. 즉 ! 하나의 쓰레드에 오류가 발생하거나 종료되면

같은 메모리 영역을 공유하고 있는 다른 쓰레드에게도 영향을 미칠 수 있다는 문제점이 있다.

2. 공유 자원에 대한 동기화

멀티 쓰레드에서 발생할 수 있는 가장 크나큰 문제이다. 바로 Stack을 제외한 메모리 영역을 모두 공유하는 형태로 실행되기 때문에 모든 쓰레드가 동시에 접근할 수 있는 '공유자원'이 발생할 수 있다.

이 공유자원에 대한 동기화를 맞춰줘야 한다는 단점이 존재한다.


#5. 멀티 프로세스의 장점

그럼 멀티 프로세스의 장점 또한 알아보자.

프로세스들은 서로 독립적인 형태로 존재하고 실행되기 때문에 하나의 프로세스에 오류가 발생하거나 죽더라도 다른 프로세스에는 영향을 미치지 않고 정상적으로 실행이 가능하다는 장점이 있다.


#6. 멀티 쓰레드 vs 멀티 프로세스

그럼 지금까지 위에서 멀티 프로세스와 멀티 쓰레드의 장/단점에 대해서 이야기를 해봤는데 어떤 것을 사용하는 것이 더 유리할까 ?? 분명 뭘 사용하든 하나의 작업을 동시에 혹은 병렬적으로 처리함으로써 처리 속도를 향상시킬 수 있다는 장점은 동일하다.

그럼 어떤 방법을 사용하는 것이 좋을까 ??

무조건 어떤 방법이 더 좋다 라고 이야기 할 수는 없다. 왜냐하면 각각의 장/단점이 있기 떄문에 적용해야 하는 시스템에 따라

적합한지 , 부적합한지로 구분할 수 있고, 시스템의 특징에 따라서 알맞은 동작 방식을 적용해서 사용하는 것이 좋다.








+ Recent posts