런타임
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 프로그램의 안정적 실행을 보장합니다.
학습 제안
다음 순서에 따라 런타임 관련 지식을 학습하는 것을 권장합니다:
