😀서론
java에서 사용하는 스레드라는 용어와 하드웨어에서 사용하는 스레드 그 외에도 커널 스레드..
스레드라는 용어가 정말 다양한 곳에서 사용 중이란 걸 알게 되었고, 이에 대해서 제대로 알고 넘어가야겠다고 생각이 들어서 정리해봅니다!
이 글은 아래 영상을 보고, 정리하는 글입니다.
😁 본론
각각의 구성요소는 아래를 의미합니다.
Applications - 사용자의 프로그램들
Kernel - OS (Windows, Linux, MacOS...)
CPU, Memory, Devices - 하드웨어
이 구조를 이해하고, 각각의 스레드들에 대해서 알아보도록 하겠습니다.
Hardware Thread
인텔의 CPU를 보시면, 6개의 Core와 12개의 thread가 있습니다.
여기서 Core는 물리적인 연산장치이고, thread는 한 코어에서 코어의 작업을 극대화하기 위해서
2개의 스레드로 분리하여 동시에 작업을 진행할 수 있도록 분리한 논리적인 작업의 단위입니다.
여기서 말하는 스레드가 바로 Hardware Thread입니다.
OS는 논리적인 스레드를 코어로 인식해서 윈도우의 작업 관리자를 켜게 되면 12개의 Core가 있다고 나오게 됩니다.
결국 12개의 코어가 있다고 인식하고 OS 레벨의 스레드들을 스케줄링하게 됩니다.
core와 hardware thread에 대해서는 이전 글을 보시면 조금 더 이해에 도움이 될 수 있습니다.
OS Thread (or Kernel Thread)
커널에 대해서 간단하게 설명하고 넘어가겠습니다.
커널(Kernel)
- 운영체제의 핵심
- 시스템의 전반을 관리 / 감독하는 역할
- 하드웨어와 관련된 작업을 직접 수행
OS Thread
- CPU에서 실제로 실행되는 단위
- 결국 CPU 스케줄링의 단위를 의미
- OS 스레드의 컨텍스트 스위칭은 커널이 개입 -> 컨텍스트 스위칭에 따른 비용이 발생한다.
OS 스레드의 다른 용어
- 네이티브 스레드
- 커널 스레드 *
- 커널-레벨 스레드
- OS-레벨 스레드
Kernel Thread
문서에 따라서 OS 커널을 수행하는 스레드라고 해석을 하는 글도 있고,
OS 스레드와 동일한 의미로 사용되기도 합니다.
User Thread
- 유저 레벨 스레드로 불리기도 함
- 스레드 개념을 프로그래밍 레벨에서 '추상화'한 것
- 유저 스레드가 CPU에서 실행되려면 반드시 OS 스레드와 연결되어야 한다.
유저 스레드의 중요한 포인트는 바로 '추상화'라는 점입니다.
자바의 클래스로 예를 들면 한 클래스의 main 클래스가 실행될 때 실행되는 단위를 '유저 스레드'라고 볼 수 있습니다.
특징에서도 적었다시피
유저 스레드는 실행되기 위해서는 반드시 OS 스레드와 연결이 되어야 합니다.
그 이유는, OS 스레드에서도 설명드렸다시피 CPU에서 실행되는 단위는 OS 스레드이기 때문이죠.
그렇기 때문에 유저 스레드는 반드시 OS 스레드와 연결이 되어야 하고, 그 후에 OS 스레드가 CPU에서 실행이 됩니다.
그렇다면, User Thread와 OS Thread를 어떻게 연결시킬까?
3가지 방법이 있습니다.
One-to-One Model
- 1:1 관계로 User Thread와 Kernel Thread(or OS Thread) 연결
- 스레드 관리를 Kernel(OS)에 위임
- 스케줄링도 커널에서 수행
- CPU Thread에 매핑을 잘 시켜주기 때문에 멀티코어를 활용
- 한 스레드가 Block이 돼도 다른 스레드는 정상 동작
- 경쟁상태(race condition) 발생 가능성
- 자바 1.2 이후부터 사용 중인 방식
Many-to-One Model
- M:1 관계로 User Thread와 Kernel Thread(or OS Thread) 연결
- 커널 개입 없이 유저 스레드끼리의 스위칭이 발생하기 때문에 one-to-one 모델보다 빠르다.
- 경쟁상태(race condition) 발생 가능성이 적다.
- 결국 실제로 동작하는 건 하나의 Kernel Thread이기 때문에 멀티코어를 활용하지 못한다.
- 한 스레드가 Block I/O가 발생하면 모든 스레드들이 Block이 발생한다.
- Block 방지를 위해 non Block I/O 방식을 진행한다.
Many-to-Many Model
- M:N 관계로 User Thread와 Kernel Thread(or OS Thread) 연결
- 커널 스레드가 유저 스레드보다 적거나 같은 모델
- 일대일 모델보다 저렴하고, 다대일 모델과 달리 하나 이상의 스레드를 사용할 수 있다.
- 구현이 복잡하다.
Two-Level Model
- Many-to-Many와 One-to-One 모델을 합쳐 보완된 모델
- 중요한 작업은 One-to-One 구조로 처리
- 나머지 작업은 Many-to-Many 구조로 처리
- 혹시나 있을 중요한 작업에서의 기다림 현상을 단축
문서에 따른 유저 스레드
유저 스레드를 지칭하는 건 문서에 따라 다를 수가 있습니다.
어떠한 기술 문서에서는 One-to-One 모델을 제외한 모델들을 유저 스레드로 지칭하고는 합니다.
그 이유는 os와 독립적으로 유저 레벨에서 스케줄링되는 스레드를 부르기 위해서라고 합니다.
Green Thread
- 자바 1.2 이전 버전에서 사용
- Many-to-One 모델을 사용
- 위에서 설명한 OS 스레드와 독립적으로 동작하기 때문에 유저 스레드와 같은 의미로 사용됨
😎 결론
하드웨어 스레드 === CPU 레벨 용어
OS 스레드 === OS 레벨 용어
User 스레드 === 프로그래밍 언어 혹은 프로그래밍 언어의 virtual machine 용어 (JVM 등)
'OS' 카테고리의 다른 글
[OS] 하드웨어의 CPU, Core, Thread (2) | 2022.08.28 |
---|