하드웨어 스레드, OS 스레드, 네이티브 스레드, 커널 스레드, 유저 스레드, 그린 스레드 등 많은 스레드들이 있다.
스레드의 종류와 개념을 정리해보자.
우리가 작성한 프로그램은 컴퓨터 상에서 위와 같이 동작한다. 컴퓨터를 구성하는 하드웨어, 하드웨어를 관리하고 컴퓨터 시스템 전반을 관리하는 OS, 그리고 우리가 개발한 프로그램은 이 운영체제를 통해서 하드웨어를 사용하게 된다.
하드웨어 스레드
코어의 고민
메모리에서 데이터를 기다리는 시간이 꽤 오래걸린다..
코어에서 프로그램이 실행될 때에 프로그램은 연산 작업을 위해서 메모리에서 데이터를 읽어오거나,
연산 작업의 결과를 메모리에 값을 쓰는 메모리에 접근하는 작업들이 코어에서 실행되는 연산 작업에 비해서 오래 걸린다.
데이터를 기다리는 동안에 코어가 아무 일도 안하는 것은 코어를 낭비하는 일이다.
그럼 메모리를 기다리는 동안 다른 스레드를 실행하는 것은 어떨까?
예를 들어, 코어가 우리가 작성한 프로그램을 실행해 연산 작업을 하다가 메모리에 접근할 때마다 코어는 쉬어야 하니 메모리에 접근하는 동안에 독립적으로 또 다른 뭔가를 실행하는 것이다. 대신에 한 쪽에 메모리에 접근하는 동안에 한 쪽의 스레드는 다른 연산 작업을 하게 된다. 이 각각을 하드웨어 스레드라고 한다. 만약에 싱글 코어 CPU에 하드웨어 스레드가 두개라면 OS는 이 CPU를 듀얼 코어로 인식하고 듀얼 코어에 맞춰서 OS 레벨의 스레드들을 스케줄링 한다. (인텔의 hyper-threading)
OS 스레드
커널의 개념
- 운영체제의 핵심
- 시스템의 전반을 관리/감독하는 역할
- 하드웨어와 관련된 작업을 직접 수행
OS 스레드
- OS 커널 레벨에서 생성되고 관리되는 스레드
- CPU에서 실제로 실행되는 단위, CPU 스케줄링의 단위
- OS 스레드의 컨텍스트 스위칭은 커널이 개입 → 비용 발생 (컨텍스트 스위칭이 일어날 때마다 유저 모드에서 커널 모드로 전환이 되고 여러 커널 코드가 CPU에서 실행되기 때문에 CPU의 리소스를 사용하게 되고, 스위칭이 끝이 나면 커널 모드에서 다시 유저 모드로 전환되는 과정에서 비용이 발생)
- 사용자 코드와 커널 코드 모두 OS 스레드에서 실행된다.
OS 스레드를 지칭하는 다른 이름
- 네이티브 스레드
- 커널 스레드 (맥락에 따라서는 OS 커널의 역할을 수행하는 스레드라는 의미로 사용)
- 커널 - 레벨 스레드
- OS - 레벨 스레드
유저 쓰레드
유저 스레드( 유저 - 레벨 스레드라고 불리기도 함. )
Thread thread = new Thread();
thread.start(); // start0 JNI 기술을 통해서 운영체제의 System call을 호출하게 됨.
- 스레드 개념을 프로그래밍 레벨에서 추상화 한 것
- 유저 스레드가 CPU에서 실행되려면 OS 스레드와 반드시 연결되어야 한다. (실제 CPU에서 실행하는 스레드는 OS 스레드)
유저 스레드와 OS 스레드를 어떻게 연결 시킬 것인가? (스레딩 모델)
- One-to-One model
- Many-to-One model
- Many-to-Many model
그린 스레드
- Java 초창기 버전은 Many-to-One 스레딩 모델을 사용, 이 때 이 유저 스레드들을 그린 스레드라고 호칭
- 현대에는 개념이 확장되어 OS와는 독립적으로 유저 레벨에서 스케줄링 되는 스레드 (One-to-One or Many-to-Many)
- 맥락에 따라서 유저 스레드와 그린 스레드를 같은 의미로 사용할 수도 있음.
'CS' 카테고리의 다른 글
[CS] 멀티 코어 vs 멀티 프로세스 vs 멀티 스레드 (0) | 2024.12.17 |
---|---|
[CS] 동기와 비동기 (0) | 2024.12.05 |
[CS] 인터럽트와 시스템 콜 (1) | 2024.12.03 |
[CS] CPU bound, IO bound (1) | 2024.12.03 |
[CS] 동기화 기법 (1) | 2024.11.28 |