프로그래밍에서 빼놓을 수 없는 키워드가 스레드와 프로세스이다.

각각의 차이점을 알아보자.

 

개념

프로세스란?

프로세스는 운영체제에서 자원을 할당받는 작업의 단위이다.
어떠한 프로그램이 실행되어 메모리 상에 올라가게 되면, 그 것을 프로세스라고 한다

스레드란?

스레드란 프로세스 내에서 실행하는 작업의 단위이다.
프로세스가 운영체제로부터 할당받은 자원을 실질적으로 이용하는 주체이다.

 

예시

편의점을 차려서 돈을 벌고자 하는 목적이 있다고 해보자. 그렇다면, 해당 목적을 위해 많은 설계를 해야 할 것이다. 자본 관리부터, 운영 계획을 설계 및 수립할 것이고, 구체적으로는 진열이나 청소, 손님 응대 등에 관한 것도 설계해야 할 것이다. 이러한 모든 설계 계획을 담고 있는 것이 프로그램이다.

 

그리고, 모든 계획을 마친 뒤 편의점을 실제로 차리는 순간이 왔다고 해보자. 이 때부터 해당 계획은 프로세스가 된다.해당 계획을 실행하기 위해선 먼저 편의점을 운영할 건물이 있어야 한다. 해당 건물을 운영체제로부터 할당받는 자원이라고 생각하면 된다. 편의점을 운영하기 위해선 건물이라는 물리적 공간이 반드시 필요한 것처럼, 프로세스를 실행하기 위해선 물리적인 메모리 공간을 할당받아야 한다.

 

편의점을 운영하기 시작했다면, 우리가 계획한 것들을 하나씩 실행해야 한다. 계획은 조금씩 쪼갤 수 있을 것이다.

 

돈을 번다 -> 물건을 판다 -> 물건을 진열한다.

 

이런 방식으로 작업을 세분화 했다고 해보자.그렇다면, 돈을 벌기 위해선 일단 물건을 진열하는 일을 해야 한다는 것이다.

 

물건을 진열하는 일처럼 목적을 위해 실행해야 하는 작은 작업들을 실제로 처리하는 주체를 스레드라고 생각하면 된다. (스레드 = 알바생)

 

게임을 예로 들어본다면, E키를 누르면 총알을 발사하는 과정을 거치기 위해선 키보드의 키 입력을 감지한 뒤, 해당 키 입력이 E와 같은지 확인하고, 투사체를 생성하고, 위치를 이동시킨 뒤, 화면에 렌더링하는 등의 수많은 작은 작업들을 실행해야 한다.이 작은 작업들 하나하나를 실행하는 주체가 스레드인 것이다.

 

프로세스는 하나의 거대한 목적이며, 스레드는 그 목적을 이루기 위해 세분화된 작업을 실행하는 주체이다.

 

 

구체적인 차이

위와 같은 개념의 차이로부터 발생하는 차이점들이 존재한다.

 

메모리 영역의 차이

 

이처럼 여러개 개의 프로세스가 동시에 실행된다면, 각 프로세스는 별도의 메모리 영역을 보유하게 된다.

각 영역은 Code, Data, Heap, Stack으로 분류되며 각각의 프로세스는 다른 프로세스의 메모리 영역을 함부로 침범할 수 없다. 프로세스의 영역이 철저히 구분되어 있는 것이다.

 

반면, 스레드의 경우 Code, Data, Heap 영역을 프로세스 내의 모든 스레드가 공유한다. 각 스레드는 연산을 하기 위해 각각 stack 영역만 할당받을 뿐, Code,Data,Heap에 대해서는 독립적인 영역을 보유하고 있지 않은 것이다.

 

이 메모리 영역의 차이로 인해 파생되는 차이점들이 많다.

 

컨텍스트 스위칭 비용

컨텍스트 스위칭이란 CPU에서 실행중인 작업을 변경하는 과정을 의미한다. 프로세스 A를 실행하고 있다가 프로세스 B를 실행하기 위해선, CPU의 레지스터 저장되어 있는 프로세스 A 관련 데이터를 모두 별도의 공간에 저장해놓은 뒤, 프로세스 B와 관련된 데이터를 새로 올려야 한다. 프로세스 단위로 작업을 변경할 때에는 Code, Data, Heap, Stack을 모두 옮겨야 하기 때문에 비용이 매우 비싸다.

 

반면, 스레드 단위의 컨텍스트 스위칭의 경우엔 Code, Data, Heap은 모두 공유하기 때문에 Stack 영역만 교체해주면 된다. 이로 인해, 상대적으로 컨텍스트 스위칭의 비용이 매우 저렴하다. (하지만 이는 상대적일 뿐, 스레드 간의 컨텍스트 스위칭도 오버헤드의 원인이기 때문에 최소화 하는 전략은 당연히 필요하다.)

 

동기화 문제

각 프로세스는 서로 간의 메모리 영역을 침범할 수 없기 때문에, 서로가 서로에게 문제를 일으키는 경우는 흔하지 않다. 

반면, 스레드의 경우는 모든 스레드가 Code, Data, Heap영역을 공유한다는 이유로 문제가 발생할 여지가 참 많다.

 

특정 스레드에서 A라는 변수의 값을 2로 바꾼다면, 다른 모든 스레드에게도 그 변화가 영향을 미칠 것이다. 만약, 어떤 스레드가 프로세스를 종료시켜버린다면? 다른 스레드도 모두 종료되어 버릴 것이다.

 

특히나 스레드를 여러개 사용하는 경우엔 스레드가 병렬적으로 작업하는 경우가 많은데, 서로의 작업 상황을 고려하지 않고 작업했다간 의도치 않은 문제가 발생할 수도 있다. (1번 스레드에서 해제한 메모리를 2번 스레드에서 참조한다면?)

 

이처럼, 스레드는 서로가 서로와 밀접하게 연관되어 있기 때문에 스레드를 여러개 사용할 때엔 세심한 주의가 필요하다.

 

 

+ Recent posts