지난 2편에서는 가상 스레드(virtual thread)의 컨텍스트 스위칭(context switching)이 구체적으로 어떤 과정으로 진행되는지 알아봤습니다. 마지막 3편에서는 가상 스레드의 중요한 이슈인 고정(pinned) 이슈와 함께 가상 스레드의 한계에 대해서 알아보겠습니다.
3편은 다음과 같은 순서로 진행합니다.
고정 이슈란
가상 스레드가 블로킹 I/O 작업을 만날 때 모종의 이유로 캐리어 스레드(carrier thread)와 연결된 가상 스레드가 교체되지 않고 고정되는 현상이 발생할 때가 있습니다. 이를 고정(pinned) 이슈라고 합니다. 이 현상이 발생하면 해당 캐리어 스레드는 더 이상 작업을 진행하지 않고 CPU와 격리되는데 이때 전체 시스템의 성능이 저하되거나 데드락(deadlock) 같은 치명적인 이슈가 발생할 수 있습니다. 따라서 가상 스레드를 사용하기 전에 고정 이슈가 발생할 수 있는 곳을 미리 확인해야 합니다.
아래 그림은 고정 이슈가 발생하는 상황을 나타낸 것입니다. Task 1, 2가 가상 스레드를 통해서 실행되다가(그림 1), Task 1에서 블로킹 I/O 작업을 만나 컨텍스트 스위칭될 때(그림 2) 고정 이슈가 발생합니다. 고정 이슈가 발생하면 가상 스레드는 PINNED 상태로 변경되고, 마운트된 플랫폼 스레드는 WAITING 상태로 변경돼 OS 레벨에서 CPU와 격리됩니다(그림 3). 원래대로라면 Task 1에서 컨텍스트 스위칭될 때 캐리어 스레드 A가 스케줄러(scheduler)에 반환돼 가상 스레드 C와 연결돼야 하