sysmon
sysmon 은 일반적인 함수로, 직역하면 시스템 모니터링이며, 주석을 제거하면 200 여 줄의 코드입니다. 이 함수는 프로그램 부트 단계에서 별도의 스레드를 할당받아 시작되며, 이후 백그라운드에서 지속적으로 Go 프로그램 런타임 상태를 모니터링하고 상응한 처리를 합니다. 이 부분 시작 코드는 runtime.main 함수에서 확인할 수 있습니다:
go
func main() {
...
mp := getg().m
mainStarted = true
systemstack(func() {
newm(sysmon, nil, -1)
})
...
}시스템 모니터 자체는 하나의 for 루프일 뿐이며, 각 루프 간격 시간은 20 마이크로초이며, 프로그램 유휴 지수가 상승함에 따라 간격 시간은 최대 10 밀리초까지 증가합니다. 각 루프에서 주로 다음 몇 가지 작업을 수행합니다:
- 코루틴 스케줄링 보조, 장시간 실행되는 코루틴 선점
- 메모리 상태 확인 및 가비지 컬렉션 필요 여부 판단
