[Golang] Goroutine VS Thread

Minsoo, Kim·2022년 12월 15일
0

Golang

목록 보기
2/2

고루틴(Goroutine)은 Go 런타임이 관리하는 경량쓰레드입니다. 이번 포스팅에서는 OS 레벨의 쓰레드와 고루틴이 어떠한 차이가 있는지 살펴보고자 합니다.

[OS] 스레드(Thread)

메모리 점유 측면

  • 고루틴은 생성 시 약 2KB의 스택 메모리 공간을 소모합니다. 필요에 따라 힙 메모리를 사용하기도 합니다.
  • 쓰레드는 쓰레드가 사용할 메모리 공간과 더불어 Guard Page로 불리는 쓰레드와 쓰레드 사이의 메모리 공간까지 포함하기 때문에 약 1MB의 메모리 공간을 소모합니다. 때문에 쓰레드를 생성하면 할수록 가용 힙 메모리 공간이 계속 줄어드는 문제점이 있습니다.

생성 및 소거 비용 측면

  • 고루틴은 Go 런타임이 논리적으로 생성하고 소거되므로 생성/소거에 드는 비용이 저렴합니다.
  • 쓰레드는 OS로부터 생성에 필요한 리소스 요청을 통해 생성합니다. 쓰레드 작업이 완료되면 해당 리소스를 다시 OS에 반환해야 합니다. 이 과정이 많은 비용을 요구합니다. 이런 문제를 해소하기 위해 쓰레드 풀을 사용하기도 합니다.

Context Switching 비용

  • Context Switching(문맥 교환)은 현재 진행중인 Task(프로세스나 쓰레드)의 상태를 저장하고 다음 진행할 Task의 상태를 읽어 적용하는 과정을 말합니다.
  • 쓰레드가 교체되어 Context Switching이 진행되면 16개의 범용 레지스터, PC(Program Counter), SP(Stack Pointer), Segment 레지스터 등에서 save/restore 작업이 진행됩니다. 이 같은 작업을 처리하기 때문에 Context Switching 시 많은 비용을 소모하게 됩니다.
  • 고루틴은 3개의 레지스터(PC, SP, DX)만 save/restore 작업을 처리하기 때문에 상대적으로 쓰레드보다 적은 비용을 소모합니다.

0개의 댓글