##프로세스와 쓰레드
예전부터 프로세스와 쓰레드를 혼동하는 경우를 많이 봤다. 사실 둘은 같기도하고 다르기도 하다 일단 각각의 간단한 정의에 대해서 살펴보자.
- 프로세스(Process) : 실행되는 프로그램의 작업 단위
- 쓰레드(Thread) : 프로세스 안에서 실행되는 흐름의 단위
둘다 무언가의 단위이다. 위 설명에서 보듯이, 쓰레드는 프로세스의 하위 개념이다.
쓰레드1 |
쓰레드2 |
쓰레드3 |
… |
쓰레드N |
즉, 이처럼 프로세스라는 큰 단위에서 쓰레드라는 여러 흐름이 있는 것이다.
#메모리의 관점에서본 프로세스와 쓰레드
프로세스와 쓰레드의 차이점을 설명할때 메모리에 관해 빼놓을 수 없을것이다.
프로세스는 운영체제로부터 일정량의 메모리를 할당받아 작동한다. 프로세스의 하위개념인 쓰레드는 자신이 속한 프로세스가 할당받은 메모리를 나눠서 작동한다.
메모리의 영역을 구분해보면 Data영역, Code영역, Stack영역, Heap영역으로 나눌수 있다. 각 영역의 특징을 생각해보면 쓰레드가 어떤 영역을 다른 쓰레드와 공유하고 따로 쓰는지 알수 있다.
-
공유하는 영역
-
Data영역 : 전역변수와 정적변등이 저장되는 영역이다. 이 변수들은 특정 함수의 호출이 끝나고도 남아있어야 하며, 전 지역에서 사용되기 때문에 공유 된다.
-
Code영역 : 프로그램을 구성하는 코드 자체가 적재되는 영역이다. 당연히 공유 된다.
-
Heap영역 : 런타임때 동적으로 제어할수 있는 메모리 영역이다. 역시 공유 된다.
-
-
공유하지 않는 영역
- Stack영역 : 지역변수등이 저장되는 영역이다. 각각의 기능(함수)이 구동되는 독립적인 영역이므로 각 쓰레드가 별도로 가지고 있다.
-
프로세스들 사이에는 메모리를 공유하지 않는다. 운영체제가 별도로 할당한다.
위와같은 이유로 프로세스와 프로세스사이의 통신, 쓰레드와 쓰레드사이의 통신방식이 다르다.
-
프로세스 끼리의 통신
- 각각의 프로세스가 가지고있는 메모리는 다른 프로세스가 직접 접근하지 못한다.
- 파일, 소켓등 중간에 연결될것이 있어야 통신이 가능하다는
-
쓰레드 끼리의 통신
- 쓰레드는 한 프로세스에서 공유하는 메모리 영역이 있다.
- 공유되는 메모리는 동기화를 해주지 않으면 데이터 레이스등의 문제가 발생할수 있다.
여담으로 헷갈릴수 있는 개념이 있다. 멀티프로세서와 멀티코어이다. 멀티프로세서를 지원하는 CPU는 여러개의 프로세스를 수행가능하게 해준다. 즉, 여러 ‘프로그램’을 동시에 실행하게 해주는 것이다. 멀티코어를 지원하는 CPU는 한 프로세스의 여러 쓰레드를 동시에 동작가능하게 해준다.
프로세스가 실행중인 프로그램의 단위라고해서 프로그램과 프로세스를 같다고 생각하는 경우가 있는데, 프로세스는 메모리에 적재되어 ‘실행중인’ 프로그램이다. 엄연히 다르다.