하드웨어 스레드
OS 관점에서는 가상의 코어로 볼 수 있습니다.
싱글 코어 CPU에 하드웨어 스레드가 2개라면, OS는 이 CPU를 듀얼 코어로 인식하고 듀얼 코어에 맞춰 OS 레벨의 스레드들을 스케줄링 합니다.
코어의 각 스레드들은 메모리 접근과 작업을 서로 겹치지 않게 진행해 사용률을 극대화 합니다.
하드웨어 스레드는 하나의 물리적 코어에서 실행되므로 스레드 간에 자원을 공유하거나 경합 상태가 발생할 수 있습니다.
OS 스레드
OS 스레드는 운영체제에서 관리하는 스레드로, OS 커널 레벨에서 생성되고 관리되는 스레드입니다.
CPU에서 실제로 실행되는 단위이며, CPU 스케줄링의 단위가 됩니다.
OS 스레드의 컨텍스트 스위칭은 커널이 개입하게 된다. 즉 컨텍스트 스위칭이 일어날 때 유저 모드에서 커널 모드로 전환이 되고 커널 모드에서 CPU 리소스를 사용하게 되므로 비용이 더 발생합니다.
사용자 코드와 커널 코드 모두 OS 스레드에서 실행됩니다.
OS 스레드는 네이티브 스레드, 커널 스레드 라고 부르기도 합니다.
역할을 세분화해 커널 코드 부분을 담당하는 스레드 만을 스레드라고도 합니다.
유저 스레드
스레드 개념을 프로그래밍 레벨에서 추상화한 것입니다.
유저 스레드가 CPU에서 실행되려면 OS 스레드와 반드시 연결되어야 한다.
결국 유저 스레드는 프로그램에서 동작하게 되는데, 프로그램이 동작하려면 CPU에 할당되어야 하는데, 할당되기 위해서는 OS 스레드와 연결이 되어야 합니다.
자바를 예로 들면 스레드 객체를 생성후 start() 할시 , 시스템 콜이 호출되고, 그 스레드는 OS 스레드와 연결됩니다.
OS와 독립적으로 유저 레벨에서 스케줄링 되는 스레드입니다.
아래의 모델에서 관계는 상관없고, 유저 모드 쪽 스레드만 사용자 스레드가 됩니다.
유저 스레드와 OS 스레드를 연결 시키는 방법은 여러가지가 있습니다.
One to One Model
자바에서 생성하는 유저 스레드와 OS 스레드는 1:1 관계를 맺습니다.
즉, 스케줄링을 포함한 스레드 관리를 OS에 위임하게 됩니다. 즉 커널이 수행한다.
또한 멀티 코어를 활용 가능합니다.
한 스레드가 block이 되어도 다른 스레드는 잘 동작한다.
하지만 OS 스레드와 1:1 매핑이기 때문에 race condition이 발생할 수 있다.
Many to One Model
유저 스레드와 OS 스레드는 N : 1 관계를 맺습니다.
유저 스레드간 컨텍스트 스위칭이 커널이 개입하지 않고, 유저 레벨에서만 일어나기 때문에 컨텍스트 스위칭 속도가 1:1 관계에 비해 더 빠릅니다.
OS 스레드는 싱글 스레드 이기 때문에 OS 레벨에서 Race Condition은 1:1 관계에 비해 가능성이 적습니다.
OS 스레드가 하나이기 때문에 멀티 코어를 활용 못합니다.
한 스레드가 block이 되면, OS 스레드도 block 되서 모든 스레드들이 block 된다. 이를 방지하기 위해 non block i/o 를 사용한다.
Many to Many Model
유저 스레드들이 여러개의 OS 스레드들을 통해 스케줄링 되며 실행된다.
위의 두가지 모델의 장점을 합친 것이다.
하지만 구현이 복잡합니다.
그린 스레드
자바의 초창기 버전은 Many to one 스레딩 모델을 사용하였다.
이 때 이 유저 스레드들을 그린 스레드라고 호칭하였다.
현재는 OS와는 독립적으로 유저 레벨에서 스케줄링되는 스레드 입니다.
맥락적으로 유저 스레드와 같은 의미가 될 수도 있다.
정리
- 하드웨어 스레드란 물리적인 처리 단위 입니다. 각 코어는 독립적인 하드웨어 스레드로 작동할 수 있습니다. 하이퍼스레딩 기술을 적용할 수도 있습니다.
- OS 스레드는 운영체제에서 관리하는 작업의 실행 단위 입니다. CPU에서 실제 실행되는 단위이고, 사용자 모드, 커널 모드에서 모두 수행 가능합니다.
- 유저 스레드는 사용자 수준에서 관리되는 스레드 입니다. 유저 스레드가 CPU에서 실행되려면 OS 스레드와 연결되어야 하는데, 3가지 방식이 있습니다.
- 1:1
- 각 유저 스레드를 OS 스레드와 매핑하여 실행하는 방식으로, 각 유저 스레드는 별도의 OS 스레드에서 실행되므로 병렬성을 확보할 수 있습니다. 또한 Race Condition이 발생할 수 있습니다.
- 1:N
- 여러 개의 유저 스레드를 한개의 OS 스레드와 매핑하여 실행하는 방식으로, Race Condition의 위험도는 줄지만, 한 유저 스레드가 Blcok 되면 OS 스레드도 Block 됩니다. 이를 방지하기 위해 non block i/o 기법을 사용합니다.
- non block i/o : 입출력 작업을 수행할 때 프로그램이 대기하지 않고 다른 작업을 수행할 수 있는 방식
- N:M
- 1:1 매핑과 1:N 매핑 방식을 합친 방식으로 두 모델의 장점을 활용 가능합니다. 하지만 구현이 복잡합니다.
- 1:1
- 그린 스레드는 자바의 초창기 버전 유저 스레드와 OS 스레드의 매핑 방식이 1:N 방식이였는데, 이때의 유저 스레드를 그린 스레드라고 합니다.
- OS 스레드를 커널 스레드, 네이티브 스레드라고도 하며, 맥락에 따라 커널 스레드는 커널 모드에서만 수행하는 스레드라는 의미로도 사용합니다