본문 바로가기
개발상식

[개발상식] 유저레벨스레드(Green Thread) vs 커널레벨스레드(Native Thread)

by devjh 2021. 12. 1.
반응형

이번게시글에서는 유저레벨 스레드와 커널레벨 스레드에 대해 정리합니다.

 

스레드는 유저레벨 스레드(Green Thread)와 커널레벨스레드(Native Thread)로 나뉩니다.

각 스레드의 차이점을 확인하고, java, c#, python, golang은 어떤식으로 동작하는지 간단하게 정리해보겠습니다.

1. 유저레벨 스레드(Green Thread)

그린 스레드라고도 불리는 유저레벨 스레드는 VM이나, Library등에서 관리되는 스레드입니다.
프로그래밍언어를 사용해서 Thread 라이브러리를 당겨와 스레드를 만들면 유저레벨 스레드가 생성됩니다.
유저레벨 스레드는 커널레벨 스레드와 1:1방식 n:1방식 혼합방식 등으로 연결됩니다.

2. 커널레벨 스레드(Native Thread)

실제 일의 주체입니다.
커널레벨 스레드를 여러개 만들면 동시에 여러 CPU코어에 CPU burst를 요청할 수 있습니다.
만약 유저레벨 스레드가 커널레벨 스레드와 1:1로 연결되어있고
CPU코어가 8개면 한 시점에 8개의 코어가 내 프로그래밍 언어의 스레드를 위해 일할 수 있습니다. 

3. 커널레벨 스레드를 사용하는것이 좋다?

커널레벨 스레드가 여러개면 마냥 성능이 잘 나오고 좋을것만 같지만
커널단의 여러가지 동기화과정이 필요하므로 무겁다는 단점도 있습니다.
예를들어 CPU코어가 2개밖에 없는 환경이라면 
유저레벨스레드100개와 커널레벨스레드100개를 만들었을때 
유저레벨 스레드가 100개가 커널레벨 스레드1개에 매핑되더라도
인터럽트와 컨텍스트 스위칭이 잘됐다면 동시에 CPU를 하나밖에 사용하지 못하더라도
CPU사용량도 충분히 나오면서 무거운 커널레벨 스레드 100개보다 성능면에서 떨어지지 않을수도 있습니다.

3. 언어별 매핑방식

(1). PYTHON

파이썬은 GIL때문에 유저레벨 스레드가 커널레벨 스레드로 n:1로 연결되어 있습니다.
아무리 스레드를 만들어봐야 커널레벨 스레드는 하나밖에 사용하지 못하며, CPU를 동시에 하나밖에 사용하지 못합니다.
싱글커널레벨스레드 언어 혹은 싱글코어 언어입니다.

(2). JAVA

자바는 버전마다 다르지만 최근의 유저레벨 스레드는 모두 1:1방식을 기본으로 채택하여 커널레벨 스레드와 연결됩니다.

(3). c#

C#도 유저레벨 스레드는 1:1방식을 기본으로 커널레벨 스레드와 연결됩니다.

 

(4). golang

golang은 일반적인 스레드가 아니라 경량스레드와 비슷한 역할을 하는 goroutine을 사용합니다.

golang엔진에서 일반적인 스레드와 조금 다른방식으로 돌아갑니다.

고루틴은 사용할 코어의 숫자를 지정하여 커널레벨스레드와 연결할 수 있습니다.
일반적으로 네이티브 스레드가 작아도 많은 수의 고루틴을 처리할 수 있습니다.

 

4. 나는 백엔드 api개발자라 thread나 goroutine을 만들지 않는다?

프로그램 진입점인 main문은 커널레벨 스레드가 실행시키며

파이썬 플라스크의 @app.route
자바 스프링의 @RequestMapping

고랭 에코의 e.GET("/", func(){})
등등 프레임워크의 도움을 받아 http request를 받아놓을 준비를 한 코드는 http request가 오면 큐에 쌓이게되는 경우가 많고 해당 큐에 쌓인 요청을 해당 프로그래밍 언어의 유저레벨 스레드가 개발한 로직을 실행시킵니다.

반응형

댓글