이번 포스트에서는 프로세스와 스레드의 차이에 대해 알아보도록 한다. 프로세스에 대해 이야기 하기 전에, 우선 프로그램에 대해서 이야기 해본다.
프로그램
프로그램은 실행 가능한 코드덩어리, 명령어의 집합이다. 메모리에 적재되어 있지 않으며, 정적인 상태를 유지하고 있다. 결론적으로는 *.exe나 *.dmg등 사용자가 더블클릭하여 실행하기 직전의 파일을 말한다.
프로세스
위 프로그램을 더블클릭하여 실행할 때, 메모리에 적재되며 실행되고 있는 프로그램의 인스턴스(독립적 개체)를 말한다. 객체지향적인 개념에서 생각하였을 때, 클래스와 인스턴스의 관계를 대조하여 생각하는 것과 비슷하다. 하나의 클래스를 토대로 여러 인스턴스를 만들 수 있듯이, 우리가 메모장을 여러개 실행하여 여러 프로세스를 실행할 수 있다.
</center>
프로세스는 커널에 의해 직접 관리가 되는데, 커널 메모리 내부에는 각 프로세스마다 관리하고 있는 프로세스와 관련된 정보들이 담겨져있다.
메모리상 프로세스는 위 4가지 정보의 집합으로 구성되어 있다.
- Code(text) : 프로그렘의 실코드.
- Data : 프로세스가 실행될 때 전역변수, static 변수를 저장.
- Heap : 런타임 중 동적으로 할당되는 변수를 저장.
- 함수에서 다른 함수를 실행하는 등 서브 루틴의 정보를 저장.
위 그림을 보면 알 수 있듯이, 각각의 프로세스는 독립된 메모리를 갖고 있으며, 다른 프로세스의 변수에 접근할 수 없다. 만일 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC,inter-process communication)을 사용해야 한다.
(한가지 예외로 같은 프로그램의 프로세스들은 Code영역을 공유한다.)
스레드
프로세스 내 실행되는 흐름의 단위 스레드라 칭한다. 프로세스의 특정한 수행 경로로, 프로세스가 할당받은 자원을 실행하는 실행 단위라고 볼 수 있다.
스레드는 별도의 레지스터와 스택을 할당받지만, Code, Data 및 Heap부분은 공유된다. 이러한 구조로, 스레드를 사용할 떄의 장점은 아래와 같다.
- 프로세스 간 통신에 비해 스레드간 통신이 훨씬 간단하다.
- 시스템간 자원 소모가 줄어든다.
- 전체 응답시간이 단축된다.
하지만 단점도 존재하는데,
- 디버깅이 어렵다.
- 설계를 더욱 더 신경써야 한다.
- 자원 공융의 문제가 발생할 수 있다(동기화 문제)
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
그럼 프로세스와 스레드의 근본적인 차이는?
프로세스는 운영체제로부터 독립된 시간, 공간 자원을 할당받아 실행되고, 스레드는 한 프로세스 내에서 많은 자원을 공유하며 병렬적으로 실행된다. 이에 따라 대다수의 프로그램이 멀티 프로세스보다는 멀티 스레드로 수행하는 이유를 아래와 같이 정리할 수 있다 :
- 자원의 효율성 증대
- 멀티 프로세스로 실행하는 작업을 멀티 스레드로 변경할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- 스레드는 프로세스 내 메모리를 공유하기 때문에 스레드간 데이터를 주고 받는 것이 간단하며, 시스템 자원 소모가 줄어든다.
- 처리 비용 감소 및 응답 시간 단축
- 프로세스간 통신(IPC)보다 스레드 간 통신 비용이 적어 작업들 간의 통신 부담이 줄어든다.(Stack을 제외하고 나머지 메모리 영역은 공유하기 때문에, 공유변수를 이용하면 된다)
- 프로세스 간의 전환속도보다 스레드 간 전환속도가 더 빠르다(Context Switching시 Stack영역만 처리하기 때문)
하지만 동기화 문제에 사전 대비해야 안전하게 충돌을 방지할 수 있다.
참고 자료 :