Go Scheduler가 새로운 M과 P를 생성하는 경우
Go 런타임에서는 고루틴, 운영 체제 스레드(OS 스레드) 및 컨텍스트/ 프로세서(M과 P)는 동시성을 관리하기 위해 협력합니다. 효율적인 성능을 위해서는 새로운 M 및 P 엔터티가 생성되는 시기를 이해하는 것이 중요합니다.
M 및 P 생성
-
M(기계): M은 OS 스레드를 나타내며 고루틴이 실행되도록 예약될 때 생성됩니다. M의 개수는 런타임.GOMAXPROCS 환경 변수에 의해 초기에 설정됩니다.
-
P(프로세서): A P는 고루틴을 실행하는 프로세서입니다. 각 P는 M과 연결됩니다. M이 블록되면 해당 P에서 고루틴을 실행하기 위해 새로운 M이 생성될 수 있습니다.
시나리오 분석
In 코드 예제에서는 차단 작업을 수행하는 여러 고루틴을 만듭니다. 이 시나리오에서는:
- 첫 번째 고루틴 배치가 기존 P 인스턴스에 예약됩니다.
- 모든 P의 로컬 큐가 가득 차면 오버플로를 처리하기 위해 새 M이 생성됩니다.
- 그러나 고루틴은 go func() 내에서 차단 작업을 수행하므로 차단된 고루틴과 관련된 M은 P에서 제거되고 유휴 스레드 풀에 배치됩니다.
- New 차단된 M을 대체하고 해당 P에서 고루틴을 계속 실행하기 위해 M이 생성됩니다.
결론
요약하면 Go 스케줄러는 다음과 같은 경우에 새 M을 생성합니다. 고루틴이 실행되도록 예약되어 있으며 무료 OS 스레드를 사용할 수 없습니다. 기존 P의 로컬 큐가 가득 차면 새 P가 생성됩니다. 그러나 차단 고루틴의 경우 각 차단 작업에는 별도의 M이 필요하므로 생성된 M 수가 가상 코어 수를 초과할 수 있습니다.
추가 리소스
- [Go 블로그의 GOMAXPROCS](https://blog.golang.org/GOMAXPROCS)
- [Go 고루틴, OS 스레드 및 CPU 관리](https://godoc.org/ 런타임/debug#SetMaxThreads)
- [GMP 기본 사항](https://www.programmersought.com/article/79557885527/)
위 내용은 Go Scheduler는 언제 새로운 M과 P를 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!