호우동의 개발일지

Today :

article thumbnail

프로세스와 스레드의 개념


우선 차이점을 알기 위해서 프로세스와 스레드의 개념부터 간단히 살펴보자.

프로세스(Process) : 운영체제로부터 자원을 할당받는 작업의 단위

 

프로세스 구조

프로세스는 운영체제에서 다루는 용어인데, 간단히 말해서 현재 실행 중인 프로그램이다.

 

프로세스에는 Code, Data, Stack, Heap
이 네 가지 형식으로 메모리를 할당한다.


그림은 프로세스와 스레드와의 차이점을 설명하기 위해 그려둔 것이기 때문에
각 형식의 자세한 설명은 하지 않도록 하겠다.


그냥 이런 식으로 구성된다는 것만 알아두면 된다.

 

 

 

프로그램 vs 프로세스

우선 프로세스를 제대로 이해하기 위해선
프로그램과 프로세스를 구별할 줄 알아야 한다.

 


프로그램은 보조 기억 장치(하드디스크, SSD 등)에 위치하며,
실행될 수 있는 명령어와 데이터의 묶음이다.

 


운영체제로부터 CPU자원을 할당받아 특정 프로그램이 메인 메모리로 할당(호출)이 된다면,
그 특정 프로그램이 프로세스가 되는 것이다.

 

 

즉, 프로그램보조 기억 장치에 존재하는 활동하지 않는 데이터이고,
프로세스메인 메모리에 존재 및 활동하는 데이터(프로그램)이다.

 

 

스레드(Thread) : 할당받은 자원을 이용하는 실행의 단위

간단히 말하자면, 스레드는 '프로세스의 실행을 어떠한 방식으로 구현해 내는가?'이다.


기본적으로 하나의 프로세스는 반드시 하나 이상의 스레드를 가지고 있다.
스레드는 그림을 통해 설명하는 것이 이해가 더 쉽다.

 

스레드

 

 

프로세스 구조에서 형식은 똑같지만 Thread를 이용하여 Stack을
별도의 영역으로 할당하고, Code, Data, Heap 영역은 공유한다.

 

즉, 프로세스 내에서 자식 스레드들은 서로 주소 공간이나 자원들을
공유하면서 실행된다는 것이다.

 

스레드를 하나만 사용하는 것을 싱글 스레드,
두 개 이상 사용하는 것을 멀티 스레드라고 한다.


각 스레드들은 독립적으로 동작한다.



멀티 스레드에 관한 자세한 내용과
스레드를 사용하는 이유에 관해서는 밑에서 서술하도록 하겠다.

 

 

 


프로세스와 스레드의 차이


프로세스와 스레드의 차이를 빠르게 이해하는 방법은
멀티 프로세스와 멀티 스레드의 차이를 이해하는 것이다.

 


지금부터 멀티 프로세스와 멀티 스레드의 비교를 통해
전체적인 차이점을 알아보도록 하자

 

 

멀티프로세스(Multi Process)

하나의 응용프로그램을 여러 프로세서가 협력적으로 일을 처리하는 것(병렬처리)

 

확실한 이해를 위해 그림으로 설명하자면 다음과 같다.

멀티 프로세스 이해도
멀티 프로세스 이해도

각 프로세스(여기에서는 CPU)가 응용프로그램을 실행할 때 독립적으로 나눠서 실행하게 된다.

이렇게 응용 프로그램을 각 프로세스가 독립적으로 처리하게 한다면, 다양한 장점이 생긴다.

 

 

  • 단일 프로세싱 방식보다 비용 절감
    프로세스들끼리 주변장치, 대용량 저장장치, 전원 공급 장치 등을 공유하기 때문에
    비용적인 측면에서 더 유리하다.


  • 신뢰성 증가
    응용프로그램을 실행하는데 각 프로세스들이 독립적이기 때문에 10개 프로세스가 있을 때,
    하나가 고장 나도 나머지 9개로 응용프로그램을 실행하면 되기 때문에
    안정성이 증가하여 실행의 신뢰도가 증가한다.

 

하지만 단점도 존재하는데
바로 Context switching에서의 오버헤드(과부하)가 생긴다는 것이다.

 

 

 

 

Context Switching

CPU에서 여러 작업(Process, Thread) 돌아가면서 작업을 처리하는 과정
Context switching이라고 한다.

 

만약 컴퓨터가 매번 하나의 Task(응용프로그램)만 처리할 수 있다면 어떻게 될까? 
해당 Task가 끝날 때까지  다른 작업은 할 수 없어 매우 불편할 것이다.



그렇기에 멀티태스킹을 통해 빠른 속도로 Task를 바꿔가며 실행한다.


이렇게 하면 사람 눈에는 마치 모든 작업이 동시에 일어나는 것처럼 보이게 된다.

 

 

 

 

Context Switching 오버헤드 발생 이유

 

 

멀티 프로세스 이해도
멀티 프로세스 이해도

우리는 응용프로그램 1,2,3을 모두 동시에 사용해야 할 수도 있기 때문에,
이 세 가지 응용프로그램은 동시에 실행되고 있어야 한다.

 

그런데 각 응용프로그램에서 요구하는 프로세스는 다르기 때문에,
각 CPU에서는 빠른 속도로 프로세스를 바꾸는 것을 반복해야 한다.

 

멀티 프로세싱에서는 각각 독립된 메모리 영역을 할당받았기 때문에
프로세스끼리 공유하는 자원이 없다.


즉, CPU에 있던 Code, Data, Heap, Stack들을 모두 초기화하고 다시 불러와야 한다.

 


이러한 과정을 반복하는 것은 매우 무거운 작업이기 때문에
시간이 많이 소모되는 등의 오버헤드가 발생한다.

 

 

 

멀티스레드(Multi Thread)

하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하는 것

 

멀티 프로세스 방식에서는 프로세스 전체를 독립적으로 두어 Task를 분할처리 했다면,
멀티 스레드 방식
에서는 스레드를 통해 Stack을 독립적으로 나눠 Task를 분할처리한 것이다.

 

멀티프로세스의 Context Switching의 오버헤드를 개선하고자 멀티 스레드 방식이 고안되었다.

 


현재는 멀티프로세스 방식보다 멀티스레드 방식이 더 자주 사용된다.
왜 이 방식이 Context Switching이 덜 발생할까?

 

멀티 스레드 구조
멀티 스레드 구조

멀티 스레드의 구조를 보면 독립적인 영역을 가지는 것은 Stack부분
나머지 Code, Data, Heap 영역은 공유된다.

 


그렇기 때문에 응용프로그램끼리의 다른 영역은
Stack부분밖에 없게 된다.

여기서 Context Switching이 일어난다고 생각해 보자.

 


CPU에서는 이제 Code, Data, Heap 부분은 놔둔 채
Stack만 바꿔주면 되기 때문에 멀티 프로세스 방식보다
훨씬 효율적으로 응용 프로그램을 실행할 수 있다.

 

 

 

  • 자원의 효율성 증대
    프로세스를 생성하여 자원을 할당하는 시스템콜이 줄어들기 때문에 자원 효율적 관리

  • 처리 비용 감소 및 응답 시간 단축
    Stack을 제외한 모든 메모리 영역을 공유하고, 스레드 간의 전환 속도가 훨씬 빠르기 때문

 

 

한 가지 단점이 존재한다면, 모든 코드와 데이터를 공유하기 때문에
스레드 간의 자원의 충돌이 발생할 수 있어 
멀티 프로세스 방식보다 훨씬 세밀하게 설계해야 한다.

 

 

 


요약 및 정리


 

 

프로세스와 스레드의 차이

프로세스는 CPU 자원을 할당받아 처리되는 작업을 의미하고,
스레드는 그 프로세스가 처리되는 방식을 뜻한다.

 

 

 

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

멀티 프로세스 방식은 응용프로그램을 프로세스 단위(프로세스 전체 독립)로 분할
멀티 스레드 방식은 응용프로그램을 스레드 단위(Stack만 독립)로 분할

 

 

멀티 프로세스에서 발생하는 Context Switching 오버헤드 문제를
해결한 방식이 멀티 스레드 방식이다.

 

 

멀티 스레드 방식이 멀티 프로세스 방식에 비해 더 효율적이라고 볼 수 있음.