본문 바로가기

CS 과목(CS科目)/운영체제(OS)

온갖 Level에서의 Thread 총정리( 하드웨어 스레드, os 스레드, native 스레드, kernel 스레드, user 스레드, green 스레드), 자바 스레드 모델

 


우리가 만든 프로그램(user program)은 OS Kernel을 통해서 컴퓨터(Memory, cpu , 그 외의 devices)내에서 실행이 된다.

오늘은 이 각 Level에서 존재하는 thread에 대해 살펴 볼 것이다. 

 

Hardware Thread( hyper-threading과 비슷 )

물리적인 core마다 하드웨어 스레드가 2개 이상일 때, 그 각각의 스레드를 hardware thread라고 불린다.

-> cpu/core 입장에서는 고민이 하나 있다. 그것은 메모리로부터 데이터를 read/write할 때, 데이터를 가지고 오는 시간이

상대적으로 길어서 cpu/core가 유휴 상태에 들어 간다는 것이다. 

그래서 Intel에서 최초로 hyper threading 기법으로 cpu/core가 메모리를 기다리는 동안 다른 스레드를 실행할 수 있게 칩

을 만들었다. 

1코어 2 스레드

 

if( 2개의 hardware thread in Single Core) {

OS recognize Single Core CPU as Dual Core CPU.

그 다음 Dual Core에 맞춰서 OS 레벨의 스레드들을 스케줄링한다.)

}

-> OS 관점에서는 또 다른 가상(logical) 코어이다.

 

OS 스레드 : OS Kernel이 생성하고 관리하는 스레드

CPU의 실행 단위 : OS 스레드

OS 스레드의 역할 :  우리가 개발한 코드는 OS가 만든 스레드에서 실행이 되며,

코드가 실행되는 도중, 인터럽트나 시스템 콜이 발생하여 Kernel mode에서 Kernel Code가 실행이 되는데 그 코드 또한

OS 스레드에서 실행을 함. 

즉, 사용자 코드와 커널 코드 모두 OS 스레드에서 실행이 된다. 

 

OS 스레드는 아래와 같이 불리기도 함

Native 스레드

커널 스레드( 이후에 다시 설명을 하겠지만, 커널 스레드는 다른 의미로도 쓰이기도 한다.)

커널 레벨 스레드

os 레벨 스레드

 

user thread( or user level thread) : 스레드 개념을 프로그래밍 레벨에서 추상화 한 것. 

 

user thread는 반드시 os thread와 연결이 되어야 한다. 아래에서 자세히 살펴 보자.

JAVA에서 제공하는 Thread Class 안에는 시스템 콜인 start0()라는 메서드를 통해 os thread를 생성할 수 있게 되있다.

이때, cpu의 실행 단위는 os thread이므로 user thread는 반드시 os thread와 어떤 형태로든 연결이 돼 있어야지만 cpu에서

실행이 가능하다.

 

그럼 user thread와 os thread를 어떻게 연결시켜야 할까????

1. One to One Model ( 오늘날의 JAVA가 채택함)

-> User thread와 OS Thread가 1대 1로 연결되는 Model.

특징

1. user thread는 os thead와 연결이 돼 있으니, 스케줄링을 포함한 user thead의 관리는 곧 OS에 위임됨을 의미한다. 

2. User thread는 멀티 코어를 잘 활용한다. 왜냐하면 멀티 코어에 os thread가 잘 배분되어서 동작이 될 것이기 때문이다.

3.위 3개의 쌍이 하나의 프로세스를 구성하고 있고, 그 중 1 쌍의 user-os thead가 마약 Block I/O 작업에 들어가서 유휴 상태라고 하자.

그러더라도 다른 user thread들은 그 외의 osthread들과 매핑이 된 독립적인 존재이기 때문에, Block I/O 작업으로부터

그 어떠한 영향을 안 받는다. 

4. user thread들은 os thread들과 1:1 매핑 관계이기 때문에 rade condition이 발생할 수도 있다. 

 

2. Many to One model : 여러 user thread가 하나의 os thread에 연결돼 있는 것.

특징

1. 여러 개의 user thread가 하나의 os thread에 연결이 되어 있기 때문에, user thread 사이에서 문맥 교환이 일어날 시, one to one model 보다 user thread 간의 문맥 교환 비용이 적게 든다. 

2.  os thread가 하나이기 때문에  one to one model에 비해 상대적으로 race condition이 적게 발생을 한다. 

 ex) 만약 2개의 user thread가 있고, 그 2개의 thread가 변수(공통으로 접근하는 리소스) count에 접근을 하여 1씩 증가시

킨다고 해보자.

many to one model에서 user level에서 문맥 교환을 거치면서 변수 count에 접근하는 race condition이 일어날 가능성

이 있다. 

그런데, 1번재 user thread에서 count에 1을 더하지 못하고 2번재 user thread가 실행이 되서 count가 1 증가하고, 다시

1번째 user thread를 실행을 해서 count 1을 더한다고 해도 race condition은 발생하지 않는다. 

그 이유는 user thread는 여러 개이지만 공통으로 접근하는 리소스(count)를 1개의 os thread가 계속 들고 있기 때문에 

올바른 count값이 보장이 된다. 

3. 멀티 코어를 활용 못한다. 

-> os thread가 1개 이기 때문!!!

4. 어느 1개의 user thread에서 block I/O가 발생을 하면, 1개의 OS Thread도 block 상태가 되기 때문에 다른 user thred

도 모두 block 상태가 된다.

 

3. many to  many model

 

 one - to -one model과 many to one model의 특성을 모두 가진다.

문서에 따라서는 아래와 같은 의미로 user thread를 지칭하기도 한다. 

 

os thread를 포함하지 않은, user thread들만을 user thread라고도 한다. 

 

Green Thread : JAVA 초창기 버전은 Many to One 스레드 모델을 사용했는데, 이때 이 user thread들을 Green Thread라고

불렀다. 

그러나 오늘날에서는 JAVA에서 뿐만 아니라 아래에서 보듯이 유저 레벨의 스레드들을 Green Thread라고 부른다.

 

조금 다른 맥락에서의 Kernel Thread

이전까지는 os thread를 다른 말로 kernel thread라고 부른다고 했는데, 아래와 같이 또 다른 정의도 있다.

kernel thread : OS 커널의 역할(시스템 관리/감독 or 하드웨어 접근 관련 코드)을 수행하는 스레드.