산으로 가자▲

쓰레드(Thread)란? 본문

Java

쓰레드(Thread)란?

이성욱입니다 2022. 10. 8. 23:44

쓰레드(Thread)란 무엇인가?

  • 쓰레드란 프로그램(프로세스) 실행의 단위이며
    하나의 프로세스는 여러개의 쓰레드로 구성이 가능하다.
  • 하나의 프로세스를 구성하는 쓰레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.
  • 프로세스와 같이 실행, 준비, 대기 등의 실행 상태를 가지며
    실행 상태가 변할때마다 쓰레드 문맥교환(context switching)을 수행한다.
  • 각 쓰레드별로 자신만의 스택 레지스터를 가진다.

  • 한순간에 하나의 쓰레드만이 실행 가능하다.

프로세스와 쓰레드의 차이

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고
쓰레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.

  • 프로세스는 실행 중인 프로그램으로
    디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것을 말한다.
  • 하지만 프로세스 생성은 많은 시간과 자원을 소비한다.

 

  • 쓰레드는 프로세스 실행 단위라고 할 수 있다.
  • 한 프로세스 내에서 동작되는 여러 실행 흐름으로
    프로세스 내의 주소 공간이나 자원을 공유할 수 있다.
  • 이 경우 각각의 쓰레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택 PC 레지스터 값을 갖고 있다.

스택을 쓰레드마다 독립적으로 할당하는 이유

  • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을
    저장하기 위해 사용되는 메모리 공간이므로
    스택 메모리 공간 독립적이라는 것은
    독립적인 함수 호출이 가능하다는 것이고
    이는 독립적인 실행 흐름이 가능하게 한다.
  • 따라서 독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당한다.

PC Resister를 쓰레드마다 독립적으로 할당하는 이유

  • PC 값은 쓰레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
  • 쓰레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다.
    그렇기 때문에 명령어가 연속적으로 수행되지 못하고
    어느 부분까지 수행했는지 기억할 필요가 있다.
  • 따라서 PC 레지스터를 독립적으로 할당한다.

쓰레드(Thread)의 장점

  • 쓰레드는 프로세스보다 생성 및 종료시간, 쓰레드간 전환시간이 짧다.
  • 쓰레드는 프로세스의 메모리, 자원등을 공유하므로 커널의 도움없이 상호간에 통신이 가능하다.

쓰레드 동기화 방법의 종류

  • Mutex / Semaphore / Monitor
    공통점은 세가지 모두 운영체제의 동기화 기법이라는 것이다.
  • 뮤텍스(Mutual Exclusion)
    • 쓰레드의 동시 접근을 허용하지 않는다는 의미.
    • 뮤텍스의 쓰레드 동기화 방법은 임계영역에 들어가기 위해 이 뮤텍스를 가지고 있어야 들어갈 수 있다.
      예) 일종의 자물쇠와 같은 역할을 한다.
      임계영역에 들어간 쓰레드가 뮤텍스를 이용해 임계영역에서 본인이 나올때까지 다른 쓰레드가 못들어오게 내부에서 자물쇠로 잠근다.
  • 세마포어(Semaphore)
    • 세마포어 역시 뮤텍스와 비슷한 역할을 하지만
      세마포어는 동시 접근 동기화가 아닌 접근 순서 동기화에 더 관련있다.
  • 모니터(Monitor)
    • Mutex(Lock)와 Condition Variables(Queue라고도 함)을 가지고 있는 Synchronization 메카니즘이다.

 

  • 우선 뮤텍스 / 모니터 / 세마포어는 개념적으로 차이가 있다.
  • 전자(뮤텍스,모니터)는 상호 배제를 함으로써 임계구역에 하나의 쓰레드만 들어갈 수 있다.
  • 후자(세마포어)는 하나의 쓰레드(binary semaphore)만 들어가거나
    혹은 여러 개의 쓰레드(counting semaphore)가 들어가게 할 수도 있다.

 

'Java' 카테고리의 다른 글

해시맵(HashMap)  (1) 2022.10.10
객체지향(OOP)  (0) 2022.10.08
자바 믹스인(mixins)이란?  (0) 2022.10.08
생성자에 대해 알아봅시다 (constructor)  (0) 2022.10.06
인스턴스 생성과 힙 메모리 (heap memory)  (0) 2022.10.06