Go 언어에는 동시 작업을 쉽게 처리하고 고성능 프로그램을 구현할 수 있는 효율적인 코루틴 스케줄러가 함께 제공됩니다. 이 글에서는 Go 언어의 코루틴 스케줄러에 대해 심층적으로 살펴보고 구현, 작동 및 최적화를 살펴보겠습니다.
코루틴 소개
코루틴은 경량 스레드 또는 사용자 모드 스레드입니다. 이는 운영 체제가 아니라 프로그래머에 의해 예약됩니다. 코루틴의 특징은 비선점형이라는 것입니다. 즉, Yield() 함수가 명시적으로 호출될 때만 컨텍스트가 전환됩니다. 따라서 코루틴의 전환 오버헤드는 매우 작고, 쉽게 생성 및 소멸될 수 있으며, 많은 코루틴을 동시에 실행하여 프로그램의 동시 실행을 달성할 수 있습니다.
Go 언어 코루틴 모델
Go 언어는 M:N 코루틴 모델, 즉 여러 시스템 수준 스레드 N의 관계에 해당하는 여러 사용자 모드 스레드 M을 채택합니다. 이 모델은 멀티 코어 CPU를 최대한 활용하는 동시에 컨텍스트 전환 오버헤드를 줄이고 스케줄링 성능을 향상시킵니다.
M은 운영 체제 스레드, 즉 운영 체제 스케줄링의 최소 단위인 물리적 스레드를 나타냅니다. N은 Go 언어 런타임 시스템(런타임)의 가상 스레드(고루틴)를 나타내며 동시성을 달성하는 가장 작은 단위입니다. N개의 고루틴은 M개의 스레드에 매핑되고 런타임 시 스케줄러에 의해 예약됩니다.
코루틴 스케줄러
코루틴 스케줄러는 작업 실행을 위해 여러 코루틴을 관리하고 예약하는 역할을 하는 Go 언어 런타임 시스템의 핵심 구성 요소입니다. 코루틴의 실행 및 전환을 제어하고 코루틴의 레벨 스케줄링을 실현할 수 있는 상위 레벨 스케줄러입니다. Go 언어에서 코루틴 스케줄러는 코루틴에서 실행 작업을 보다 효율적으로 전환할 수 있는 Goroutine이라는 추가 실행 엔터티를 사용합니다.
코루틴 스케줄러 구현 원리
코루틴 스케줄러의 구현 원리는 운영 체제 수준과 Go 언어 런타임 시스템 수준의 두 가지 수준으로 나눌 수 있습니다.
운영 체제 수준
운영 체제 수준에서 코루틴 스케줄러는 런타임 시 여러 사용자 스레드를 여러 운영 체제 스레드에 매핑하여 멀티 코어 CPU의 병렬 컴퓨팅 기능을 활용합니다.
Go 언어 코루틴 모델의 M:N 아키텍처, 즉 M은 운영 체제 스레드(Machine)를 나타내고 N은 Go 언어의 가상 스레드를 나타냅니다(N은 Goroutine을 나타냄). 스케줄러가 관리합니다. 런타임에. 스케줄러의 주요 기능은 각 운영 체제 스레드에서 예약 작업 대기열을 유지하고, 작업 대기열의 작업 우선 순위와 예약 알고리즘에 따라 각 스레드에서 작업 실행을 동적으로 예약하고, 스레드 리소스를 관리하는 것입니다.
Go 언어 런타임 시스템 수준
Go 언어 런타임 시스템 수준에서 코루틴 스케줄러는 스케줄러, 스케줄러 큐 및 P의 세 가지 메커니즘을 사용합니다.
Scheduler
Go 언어의 코루틴 스케줄러는 스케줄러 큐, P 큐, 스핀 번호, 스케줄링 알고리즘 등을 유지 관리하는 글로벌 스케줄러에 의해 제어됩니다. 스케줄러는 각 스레드의 작업 실행을 동적으로 관리하여 코루틴의 실행 효율성을 최적화합니다.
스케줄러 큐
스케줄러 큐는 스케줄러가 예약 대기 중인 모든 고루틴을 기록하는 곳입니다. 스케줄러가 P에 고루틴을 할당하면 먼저 대기열에서 예약을 기다리는 고루틴을 찾습니다. 발견되면 즉시 P의 로컬 대기열에 넣습니다. 발견되지 않으면 새 고루틴을 생성하여 P에 넣습니다. 로컬 대기열.
P
P는 고루틴을 실행하는 데 사용되는 프로세서이며, 이것이 소유한 큐는 로컬 큐입니다. P의 수는 GOMAXPROCS 환경 변수에 의해 제어됩니다. 설정되지 않은 경우 Go 프로그램은 기본적으로 머신의 코어 수를 사용합니다.
Go 스케줄러의 최적화
Go 스케줄러에는 많은 최적화 전략이 있으며 다음은 그 중 몇 가지입니다.
특정 P 큐의 모든 고루틴이 차단되면 Go 스케줄러는 다른 P 큐의 고루틴을 찾습니다. 그런 다음 P 큐는 일부를 훔쳐서 실행하기 위해 자체 큐에 넣습니다. 이 전략은 모든 P에 대한 안정적인 로드 및 로드 공유를 보장합니다.
Goroutine은 실행 중에 자체 타이머를 설정할 수 있습니다. 시간이 다 되면 Runtime.Goexit를 호출하여 이 Goroutine을 적극적으로 예약할 수 있음을 런타임에 알립니다. Go 스케줄러에는 goroutine이 Goexit을 적극적으로 호출하지 않는 경우 선점 정책도 있습니다. Go 1.13 이전에는 GOMAXPROCS가 1인 경우에만 선점이 가능했습니다. 이제 더 많은 상황을 지원하도록 업그레이드되었습니다.
서로 다른 스레드 간의 작업 경쟁을 줄이기 위해 각 스레드는 자체 로컬 대기열을 갖습니다. 각 스레드는 먼저 로컬 대기열에서 작업을 가져와 로컬 대기열이 비어 있을 때만 실행합니다. 작업을 얻으려면 글로벌 큐로 이동하세요.
요약
코루틴 스케줄러는 Go 언어의 고성능 동시성의 핵심 구성 요소 중 하나입니다. 작업을 실행하기 위해 여러 코루틴을 관리하고 예약하는 역할을 하며 M:N 코루틴 모델을 채택하고 운영 체제 수준과 Go 언어 런타임 시스템 수준에서 다양한 메커니즘과 알고리즘을 사용하여 코루틴의 효율적인 실행과 예약을 보장합니다. 동시에 Go 스케줄러에는 코루틴 선점, 로컬 실행 대기열, 작업 도용과 같은 많은 최적화 전략이 있어 프로그램을 보다 효율적으로 실행하고 프로그램 성능과 처리량을 향상시키는 데 도움이 됩니다.
위 내용은 Go 언어의 코루틴 스케줄러에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!