아무나개발하자

스레드 정리 본문

OS

스레드 정리

개발천재나천재 2023. 1. 3. 09:11

 

- 우리가 작성하는 프로그램은 OS Kernel을 통해 하드웨어인 메모리, CPU, Device를 사용할 수 있는 것이다. 이제부터 각각의 레벨에 해당하는 Thread에 대해 설명하겠다.

 

 

코어의 고민 (Hardware Thread)

메모리에서 데이터를 기다리는 시간이 꽤 오래 걸린다. -> 메모리를 기다리는 동안 다른 스레드를 실행하는건 어떨까??

Hardware Thread 설명

코어가 한개만 있다고 가정하고 compute(core가 연산 시간), memory(메모리에 적재, 저장등의 시간)에서 memory시간에는 다른 연산을 실행하자 라는개념에서 출발 그래서 위의 그림을 보면 각각의 하나 하나 연산의 흐름을 H/W 스레드라고 한다.

 

hyper - threading

물리적인 코어마다 하드웨어 스레드가 두개라고 생각

결론 : CPU상에서, 코어 하나하나의 사용 효율을 극대화 하기 위해 개발된 hardware 레벨의 스레드

 

문제

- OS는 코어 4개의 CPU로 인식을 하게 된다.

 

 

os thread

Kernel : 운영체제의 핵심으로 시스템의 전반을 관리 감독하는 역할을 하며, 하드웨어와 관련된 작업을 직접 수행한다.

따라서 OS Thread는 OS 커널 레벨에서 생성되고 관리되는 스레드를 말한다. 즉 CPU에서 프로세스가 실행되기 위한 실행되는 단위이다.

 

OS Thread의 컨텍스트 스위칭은 커널이 개입하여 수행한다 또한 사용자 코드와 커널코드 모두 OS 스레드에서 실행된다.

사용자 코드(노란색)가 수행되다, system call로 인해 커널 코드가 수행되고 다시 종료되면 사용자 코드가 수행된다.

 

OS Thread의 다른 이름

 

 

문제2

정답

듀얼 코어를 하이퍼 스레딩을 적용하였기 때문에 Hardware Thread는 총 4개가 되고, 그래서 OS입장에서는 총 코어를 4개로 생각하여 OS 스레드 8개를 각각 두개씩 할당하게 된다.

 

 

 

User Thread

- 스레드 개념을 프로그래밍 레벨에서 추상화 한것을 말한다.

user thread

자바 언어에서의 new Thread()로 생성한 "thread"가 user level의 스레드라고 할 수 있다. 실제로의 동작 방식은 thread.start()를 통해 start0를 호출, start0에서 JNI(java native interface)를 통해 system call -> clone을 통해 os레벨의 스레드를 하나 생성하고 user level thread에 1대1로 매핑

여기서 중요한것은 유저 스레드가 CPU에서 실행이 되기 위해서는 OS스레드와 반드시 연결이 되야한다.

 

 

 

유저 스레드와 OS 스레드를 어떻게 연결 시킬 것인가?

 

one - to - one 모델 (java)

유저 스레드가 OS 스레드에 1대1로 매핑이 되기 때문에, 스레드 관리를 OS에게 위임한다. 따라서 커널이 스레드 스케줄링을 담당한다. 

CPU의 코어가 여러개가 있다고 할때도 커널레벨에서 멀티코어를 활용해 잘 동작한다.

한 프로세스 내에서 여러개의 스레드를 생성했다고 가정했고, 한개의 스레드를 블락했을 경우 다른 스레드들은 잘 동작을 한다.

race condition 가능성이 있다.

 

many - to - one 모델 

여러개의 유저 스레드가 한개의 OS스레드에 매핑되는 모델이다. 이러한 경우는 컨텍스트 스위칭이 발생할때, OS스레드의 컨텍스트 스위칭이 발생하지 않기 때문에 빠르다는 장점이 있다. 또한 race condition이 유저 스레드 간에만 발생하기 때문에 가능성이 적다.

하지만 실질적인 OS 스레드는 한개라서 CPU의 멀티코어를 활용하지 못한다는 단점이 존재한다.

또한 한개의 유저 스레드의 Block는 모든 스레드를 Block한다는 점이다 -> 해결책 : Nonblock IO

 

 

many - to - many 모델  -> OneToOne과 ManyToOne을 짬뽕해서 만듬

 

 

 

 

Green thread

java 초창기 버전은 Many - to - One 스레딩 모델을 사용했다 -> 이때 이 유저 스레드들을 그린 스레드라고 호칭

하지만 의미가 조금 확장되서 OS와는 독립적으로 유저레벨에서 스케줄링 되는 스레드를 의미한다.

맥락에 따라서 User thread가 Green thread와 동일하게 사용될 때도 있음

 

 

조금 다른 의미에서 Kernel thread

OS 커널의 역할을 수행하는 스레드라는 의미도 있음

 

 

출처 : https://www.youtube.com/watch?v=vorIqiLM7jc

'OS' 카테고리의 다른 글

동기화(synchronization)  (0) 2023.01.14
CPU bound, IO bound  (0) 2023.01.13
Context Switching  (0) 2023.01.12
운영체제 정리 1탄  (0) 2023.01.02