쓰레드(Thread)

Devkty·2025년 5월 11일

쓰레드

프로그램에서 한 순간에 하나의 명령어만을 실행하는 고전적인 관점에서 멀티 쓰레드 프로그램은 하나 이상의 실행 지점을 가지고 있습니다.
멀티 쓰레드는 각 쓰레드가 프로세스와 매우 유사하지만, 차이가 있다면 쓰레드들은 주소 공간을 공유하기 때문에 동일한 값에 접근할 수 있습니다.

하나의 쓰레드의 상태는 프로세스의 상태와 매우 유사합니다.
쓰레드는 어디서 명령어들을 불러 들일지 추적하는 프로그램 카운터와 연산을 위한 레지스터들을 가지고 있습니다.
→ 만약, 두개의 쓰레드가 하나의 프로세서에 실행 중이라면 실행하고자 하는 쓰레드는 반드시 Context switch을 통해서 실행 중인 쓰레드와 교체되어야합니다.

쓰레드간 문맥교환은 레지스터들 기준으로 저장하고 복원한다는 점에서 프로세스 과정과 유사합니다.
프로세스가 문맥 교환을 할 때 프로세스의 상태를 PCB에 저장하듯이 프로세스의 쓰레들의 상태를 저장하기 위해서는 하나 또는 그 이상의 TCB가 필요합니다.
→ 가장 큰 차이 중 하나는 쓰레드 간의 문맥 교환에서는 주소 공간을 그대로 사용한다는 것입니다.

그외의 차이는 스택에 있습니다.

단일 쓰레드 프로세스: 주소 공간과 같은 간단한 모델에서는 스택이 주소 공간의 하부에 하나만 존재합니다.

멀티 쓰레드 프로세스: 각 쓰레드가 독립적으로 실행되며 쓰레드가 실행하기 위해 여러 루틴을 호출할 수 있습니다. 주소 공간에는 하나의 스택이 아니라 쓰레드마다 스택이 할당되어 있습니다. 두 개의 쓰레드를 가지는 멀티 쓰레드 프로세스의 주소 공간은 단일 쓰레드 프로세스의 주소 공간과 다릅니다.

해당 그림에서는 두 개의 스택이 프로세스 주소 공간에 존재하는 것을 볼 수 있습니다.

Thread-local storage: 스택에서 할당되는 변수들이나 매개변수, 리턴 값, 그 외에 것들을 쓰레드 스택에 넣는 것

Thread-local storage 로 인해 정교한 주소 공간의 배치가 무너집니다.(스택 오버플로우) 전엔 스택과 힙이 독립적으로 확장되기 때문에 주소 공간에 더 이상 공간이 없는 경우에만 문제가 생겼지만, 지금은 예전과 다르게 깔끔하지 않습니다. 다행스러운 것은 재귀 호출을 아주 많이 하는 경우를 제외하고, 스택의 크기가 아주 크지 않아도 되기 때문에 대부분의 경우에는 문제가 되지 않습니다.


쓰레드 생성 예제

A와 B를 각각 출력하는 쓰레드를 생성하는 프로그램을 실행시킨다고 가정을 해봅니다. 메인 프로그램은 각각 위의 mythread() 함수를 실행할 두 개의 쓰레드를 생성합니다. 이때 각각 mythread() 함수를 실행할 두 개의 쓰레드를 생성하고 서로 다른 인자를 전달받습니다.
→ 스케줄러의 동작에 따라 다르겠지만 쓰레드가 생성되면, 즉시 실행될 수도 있고, 준비 상태에서 실행은 되지 않을 수도 있습니다.

두 개의 쓰레드를 생성한 후에 메인 쓰레드는 pthread_join 을 호출하여 특정 쓰레드의 동작의 종료를 대기합니다. 실행 순서를 살펴보면 다음과 같습니다.

실행 순서 1안

  1. Main 실행 시작 후 ”main: begin” 출력
  2. T 1 생성
  3. T 2 생성
  4. T 1 대기
  5. T 1 실행 (“A” 출력 후 리턴)
  6. T 2 대기
  7. T 2 실행 (”B” 출력 후 리턴)
  8. “main: end” 출력

실행 순서 2안

  1. Main 실행 시작 후 ”main: begin” 출력
  2. T1 생성
  3. T1 실행 (“A” 출력 후 리턴)
  4. T2 생성
  5. T2 실행 (”B” 출력 후 리턴)
  6. T1 대기 후 즉시 리턴(T1 완료)
  7. T2 대기 후 즉시 리턴(T2 완료)
  8. “main: end” 출력

유의할 점은 실행 순서가 쓰레드가 유일한 실행 가능 순서가 아니라는 것입니다. 스케줄러가 특정 시점에 실행하는 쓰레드에 따라 다양한 순서가 있을 수 있습니다.

이 이후 내용은 생략하겠습니다. 정리를 하는데에 시간이 너무 오래걸려서 그냥 책을 보고 이해하도록 하겠습니다.

profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글