스레드는 프로그램 내에서 실행되는 최소 단위로, 프로세스의 자원을 공유하여 작업을 수행한다.
프로세스는 컴퓨터 내 작업을 의미하고 스레드는 그 작업 내 존재하는 작은 흐름이다.
스레드는 기본적으로 프로세스의 코드 영역, 데이터 영역, 힙 영역을 공유한다.
반면 스택과 레지스터는 스레드별로 가진다.
💡 별도의 스택을 갖는 이유
독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을저장하기 위해 사용되는 메모리 공간이다.
따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 가능하게 한다.
💡 PC Resister를 쓰레드마다 독립적으로 할당하는 이유
PC 값은 쓰레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다.
그렇기 때문에 명령어가 연속적으로 수행되지 못하고어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다
프로세스와 스레드의 차이점은 멀티 프로세싱과 멀티 스레딩 환경에서 극명해진다. 이 두 가지를 비교하기 전에 멀티 프로그래밍, 멀티 태스킹에 대한 이해가 필요하다.
💡 병렬성과 동시성
- 프로세서가 여러 개인 경우 멀티 스레드를 통해
병렬성(Parallelism)
을 높일 수 있다. 즉, 여러 작업이 동시에 수행될 수 있다.- 만약 프로세서가 하나인 경우엔 멀티 스레드를 통해
동시성(Concurrency)
을 높일 수 있다.
- 실제로는 각각의 시간에 한 작업만 수행되지만, 병렬적으로 수행되는 것처럼 보이는 것이다.
- 한 개의 코어에서의 멀티스레딩은 진정한 멀티스레딩이라기보다는
시분할
이라고 부르는 게 맞음.
스레드
는 레지스터, 스택 이외는 공유하고 있기 때문에 생성 시 사용되는 비용이 적다. 또한 같은 프로세스 내 스레드끼리의 컨텍스트 스위칭 비용 또한 낮다.
이렇게 보면 멀티 프로세스에 비해 멀티 스레드가 확실히 유리해보인다.
하지만 멀티 프로그래밍, 멀티 스레딩 환경에서는 하나 더 고려해야할 점이 있다.
그것은 바로 동시에 같은 데이터를 참조할 경우이다. 동시에 같은 데이터를 참조하면서 서로 다른 연산을 수행할 경우 의도치 않은 결과가 일어날 수 있다.
또 스레드
는 프로세스에 종속되어 있고 서로 같은 자원을 공유하기 때문에 하나의 스레드가 죽으면 다른 스레드에도 영향이 간다. 반면 프로세스
는 각각 독립적인 공간을 가지고 있기 때문에 서로 영향이 없다.
이와 관련된 개념이 Critical Section이고 다음 챕터에서 다루도록 하겠다.