코어의 연산 속도는 메모리보다 빠르기 때문에, 메모리에서 데이터를 보내는 시간을 기다리기 아쉽다.
메모리의 데이터를 기다리는 동안 다른 스레드를 실행하는건 어떨까?
코어는 연산 작업을 끝내고 메모리의 데이터를 기다린다.
따라서 한쪽 메모리 값을 기다릴 때 다른 한쪽에서 코어를 사용하도록 한다.
즉, 서로 다른 쓰레드를 실행시킨다. 각각을 하드웨어 스레드라 한다.
CPU 코어 1개당 스레드가 2개이다.
하드웨어 스레드 : OS관점에서는 가상의 코어, CPU의 스레드
OS Kernel과 관련된 스레드
OS 스레드 : OS 커널 레벨에서 생성되고 관리되는 스레드
OS 스레드의 컨텍스트 스위칭은 커널이 개입 -> 비용발생 (유저모드 -> 커널모드)
사용자 코드와 커널 코드 모두 OS 스레드에서 실행된다.
어떤 기술 문서에서는 OS 커널의 역할을 수행하는 스레드는 커널 스레드라 한다.
User Program과 관련된 스레드
유저 스레드 : 스레드 개념을 프로그래밍 레벨에서 추상화 한 것
자바에서 스레드 객체를 생성하고 스레드를 실행시킨다. 자바 레벨에서 스레드를 추상화한다.
유저 레벨 스레드가 시스템 콜을 통해 OS 스레드를 사용하고 CPU상에서 실행된다.
Java -> 유저 스레드와 OS 스레드가 1:1로 연결된다.
스레드 관리, 스케줄링을 OS에 위임한다. 스케줄링을 커널이 수행
만약 한 프로세스에 스레드가 2개 이상인 경우 한 스레드가 블락이 되도 다른 스레드는 잘 동작한다. 하지만, race condition의 위험이 존재한다.
컨텍스트 스위칭이 매우 빠르다.
why? 유저 스레드 레벨에서만 컨텍스트 스위칭이 발생하고, OS 레벨에서 컨텍스트 스위칭이 발생하지 않기 때문에, 프로세스간 컨텍스트 스위칭이 발생하지 않는다.
race condition의 가능성이 적다. 하지만, OS 스레드가 1개이기 때문에 멀티코어를 활용하지 못한다.
유저 스레드가 블락되는 순간 OS 스레드도 블락되기 때문에 한 스레드가 블락되면 모든 스레드가 블락된다 -> 해결 : non block I/O
One-to-One, Many-to-One의 장점만을 사용하는 방식
구현이 어렵다.
OS와는 독립적으로 유저 레벨에서 스케줄링되는 스레드
(기술 문서마다 차이가 존재한다.)
기술문서 마다 차이가 존재하기 때문에 맥락을 잘 파악해야한다.
어떤 의미로는 유저 스레드와 같은 의미를 뜻한다.
OS와는 별개로 유저 레벨에서 자체적으로 관리되고 스케줄링 되는 스레드는 '유저 스레드' 혹은 '그린 스레드'로 불린다