티스토리 뷰
Process와 Thread
쓰레드(thread)란 프로세스 안에서 프로그램을 실제로 실행하는 주체를 말한다. 쓰레드는 프로세스에 할당된 메모리나 자원을 사용하여 독립적으로 프로그램을 실행하게 된다. 그렇다면 여기서 프로세스는 뭘까? 쓰레드를 이해하려면 먼저 프로세스가 뭔지 알아야 할 것 같다.
프로세스(Process)를 이해하기 위해선 프로그램이 어떻게 실행되는가에 대한 이해가 필요하다. 이 과정을 쉽게 설명하면 디스크에 존재하는 어떤 프로그램이 실행될 때 그 프로그램을 실행하기 위해 메모리와 자원이 할당되고 프로그램의 바이너리 코드가 메모리에 올라가게 된다. 이 때 프로그램을 실행하기 위한 프로세스가 생성된다고 생각할 수 있다. 말 그대로, 프로세스는 실행 중인 프로그램을 의미한다.
프로세스가 생성되면 실제로 코드를 실행하는 동작은 쓰레드에서 처리하게 된다.
따라서, 모든 프로세스는 쓰레드를 갖고 있다.
이제 쓰레드가 무슨 일을 하는지 알게 되었다.
그렇다면 우리는 프로세스에서 프로그램을 실제로 실행하는 단위인 쓰레드의 구조나 특징을 알아야 할 필요가 있다.
- 쓰레드란 프로그램(프로세스) 실행의 단위이며 하나의 프로세스는 여러개의 쓰레드로 구성이 가능하다
- 하나의 프로세스를 구성하는 쓰레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.
- 프로세스와 같이 실행, 준비, 대기 등의 실행 상태를 가지며
- 실행 상태가 변할때마다 쓰레드 문맥교환(context switching)을 수행한다.
- 각 쓰레드별로 자신만의 스택과 레지스터를 가진다.
쓰레드의 구조를 나타낸 이미지이다. 큰 사각형은 하나의 프로세스를 도식화한 것이고 Thread라는 작은 사각형을 보면
프로세스가 할당 받은 메모리와 레지스터 등 자원을 공유하고 있는 것을 알 수 있다.
여기서 알 수 있는 특징은, 힙, 스태틱, 코드부는 공유하지만 스택과 PC 레지스터는 독립적으로 사용한다는 것이다.
그 이유는 다음과 같다.
- 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고
이는 독립적인 실행 흐름이 가능하게 한다.
한 줄로 설명하면, 쓰레드는 독립적으로 실행되어야 하므로 독립적인 메모리가 필요하다는 것이다.
그렇다면 PC 레지스터는 왜 독립적으로 사용해야 할까?
PC레지스터는 Program Counter,의 역할을 수행한다 이는 명령어가 어디까지 실행되었고 다음 실행할 명령어의 메모리 주소를 알려주는 역할이다. 따라서 1번 쓰레드가 동작하다가 2번 쓰레드가 자원을 할당받아 다시 대기열로 돌아간다면 현재 어디까지 실행했는지에 대한 정보를 담을 공간이 필요해서 PC 레지스터도 독립적으로 갖고 있어야 한다.