Skip to content

런타임

Go 언어의 런타임 (runtime) 은 Go 프로그램 실행의 핵심 인프라로, 프로그램의 메모리 할당, 가비지 컬렉션, 코루틴 스케줄링, 시스템 모니터링 등 주요 기능을 관리합니다. 다른 언어와 달리 Go 의 런타임은 사용자 코드와 밀접하게 통합되어 있어, Go 가 효율적인 동시성 프로그래밍과 자동 메모리 관리를 실현할 수 있게 합니다.

핵심 구성 요소

Go 런타임은 주로 다음 몇 가지 핵심 구성 요소로 이루어져 있습니다:

GMP 스케줄러

GMP 스케줄러는 Go 런타임에서 가장 핵심적인 구성 요소 중 하나로, 대량의 goroutine 을 제한된 시스템 스레드에 합리적으로 스케줄링하는 역할을 담당합니다. GMP 는 각각 다음을 의미합니다:

  • G (Goroutine): 코루틴, Go 의 경량 스레드
  • M (Machine): 시스템 스레드, 운영체제 수준의 실행 스레드
  • P (Processor): 프로세서, Go 코드 실행에 필요한 자원을 포함

GMP 스케줄러의 설계로 Go 는 수천 수만의 동시 코루틴을 효율적으로 지원할 수 있으며, Go 언어의 고동시성 특성의 기반이 됩니다.

메모리 할당기

Go 의 메모리 할당기는 힙 메모리 할당을 관리하며, 설계는 Google TCMalloc 의 영향을 많이 받았습니다. 주요 특징은 다음과 같습니다:

  • 다단계 캐시 설계로 락 경쟁 감소
  • 객체 크기에 따라 다른 할당 전략 채택
  • 객체를 스택에 할당할지 힙에 할당할지 자동 결정

메모리 할당기는 가비지 컬렉터와 긴밀하게 협력하여 효율적인 메모리 관리를 실현합니다.

가비지 컬렉터

Go 는 동시성 마크 앤드 스위프 (Concurrent Mark-Sweep) 가비지 컬렉션 알고리즘을 채택했으며, 주요 특징은 다음과 같습니다:

  • 3 색 마킹 알고리즘
  • 쓰기 배리어 기술을 통한 동시성 컬렉션
  • 저지연, 대부분의 경우 STW 시간이 100 마이크로초 미만

Go 의 가비지 컬렉터는 수년간의 최적화를 거쳐 대부분의 비즈니스 시나리오 성능 요구를 충족할 수 있게 되었습니다.

시스템 모니터

시스템 모니터 (sysmon) 는 독립적인 모니터링 스레드로, 다음을 담당합니다:

  • 장시간 실행되는 코루틴 선점
  • 가비지 컬렉션 트리거 필요 여부 확인
  • 시스템 상태 모니터링 및 상응한 조정

이는 백그라운드에서 지속적으로 실행되어 Go 프로그램의 안정적 실행을 보장합니다.

학습 제안

다음 순서에 따라 런타임 관련 지식을 학습하는 것을 권장합니다:

  1. 먼저 GMP 스케줄러 를 학습하여 코루틴 스케줄링 메커니즘을 이해합니다.
  2. 그 다음 메모리 할당기 를 학습하여 메모리가 어떻게 할당되는지 이해합니다.
  3. 그 다음 가비지 컬렉터 를 학습하여 메모리가 어떻게 회수되는지 이해합니다.
  4. 마지막으로 시스템 모니터 를 학습하여 런타임의 백그라운드 모니터링 메커니즘을 이해합니다.

Golang by www.golangdev.cn edit