운영체제를 해보았다면, 스레드라는 작업단위에 대해 들어보았을 것이고, multi-thread를 통해서 parallel computing에 대해 어느정도 들어는 보았을 것이다.
그런데, 이것을 Managed Language에 대입해서 적용할 때, 여러 가지 고려사항이 생긴다. 이 중에서도 운영체제 차원의 스레드와는 조금 다른 개념인 "Green Thread"에 대해 이해하는 것이 중요하다.
이 포스트에서는 대략적인 기조를 바탕으로 Green Thread가 무엇인지, 그것이 전통적인 OS-level Thread와 어떻게 다른지, 그리고 장단점 및 실제 사용 사례를 간단히 알아볼 것이다.
yield하는 것이 코루틴의 핵심 역할이다.Event Loop는 함수들의 Event와 Trigging으로 하나의 Loop를 만들어서 그것들이 반복된다고 해석하면 된다.JavaScript의 Runtime이 가장 대표적인 예시인데, 한 함수를 만약 spin lock형식으로 구현하였다면 안움직이는 문제가 발생 할 것이다. (이는 한 이벤트가 너무 긴 시간을 점거하기 때문이다 !)최근의 Go나 Java Virtual Thread 같은 M:N 모델은 이 단점을 극복하고 멀티 코어를 활용한다.
- OS Thread는 운영체제가 직접 관리하며, CPU 코어와 1:1 매핑되거나 스케줄링된다.
- 이에 반해 Green Thread는 언어 런타임이나 VM에서 관리되며, 운영체제가 관여하지 않는다.
- OS Thread는 문맥 전환 시 운영체제 커널 레벨에서 개입하기 때문에 상대적으로 무겁다.
- Green Thread는 런타임 수준에서 처리되므로 문맥 전환 비용이 낮다.
- OS Thread는 다중 코어를 활용한 병렬 처리가 가능하다.
- Green Thread는 한 번에 하나의 코어만 사용할 수 있어 병렬 처리에는 한계가 있지만, I/O Bound 작업에서는 큰 이점을 제공한다.
최근 Modern 언어들이 다시금 Green Thread model을 도입하고 있다.
JDK 21부터,
Virtual Thread라는 기능으로 업그레이드 되었다.
기존Green Thread는Native Thread1개와 유저가 지정한 태스크 N개였다면,
Virtual Thread는Native ThreadM개와 유저가 지정한 태스크 N개의 차이가 있다.
초기의 Green Thread(M:1)는 병렬 처리가 불가능했으나, 최근의 Virtual Thread나 Goroutine(M:N)은 런타임 스케줄러가 여러 OS 스레드를 활용하여 진정한 병렬 처리를 지원한다.
도입을 검토중이다. 다만 회의적인 결과 1 로 인하여 조금 느릴것이다.
1 :async-await보다 느린 green thread를 볼 수 있다.
- 다만, 현존하는 Task class와 헷갈릴 수 있다.
- 이 둘의 차이는 async/await 기반이냐 아니면 thread 기반이냐의 차이로서, task는
대기 가능이라는 속성을 가지지만 green thread는 그렇지 않단 특성을 가지는 것이 특징이다. (Function Color 문제를 해결할 수 있다.)
Thread class와 비교하는 것이 올바른 것으로 생각된다만, 솔직히 의미가...?
c++ 20부터 추가된
Coroutine를 통해서 유사하게 사용가능하다
다만,C#혹은JS의async-await와는 차이가 있음을 알아두어야 한다.