시스템 호출을 넘어서는 고루틴 항복점
Go 프로그램에서 고루틴은 동시성을 위한 기본 메커니즘입니다. 고루틴을 차단하는 syscall은 알려진 양보점이지만, 다른 가능한 양보점을 고려하지 않으면 고루틴 스케줄링에 대한 이해가 완전하지 않습니다.
예상되는 양보점 중 하나는 스케줄러가 스택을 확인해야 하는 함수 호출입니다. 성장. 그러나 고루틴은 수학적 연산만 수행하는 경우 "고루틴이 종료되거나 다른 사람에게 실행을 양보할 수 있는 항목에 도달할 때까지 스레드를 잠급니다"라고 명시되어 있습니다.
이를 테스트하기 위해 실행되는 프로그램이 만들어졌습니다. 함수 호출 없이 세 개의 루프(메인 함수에 하나, 별도의 고루틴에 두 개). 프로그램은 GOMAXPROCS를 1로 설정하여 Go 코드를 동시에 실행할 수 있는 OS 스레드 수를 제한합니다. 그러나 출력에는 여전히 기본 함수와 고루틴의 인터리빙된 메시지가 표시되어 고루틴이 함수 호출 없이도 제어권을 양보한다는 것을 암시합니다.
이 명백한 불일치에 대한 답은 Go 1.14에 도입된 비동기 선점에 있으며, 이는 잠재력을 추가합니다. 거의 모든 곳에서 선점 지점이 있습니다. 따라서 고루틴은 syscall 차단 이외의 다양한 지점에서 제어권을 양보할 수 있습니다.
선점 지점의 정확한 구현은 Go 릴리스 간에 변경될 수 있지만 비동기 선점은 함수 호출이 없는 루프가 더 이상 스케줄러를 교착 상태로 만들거나 가비지를 크게 지연시키지 않도록 보장합니다. 수집. 그럼에도 불구하고 동기화되지 않은 배열 쓰기 및 비원자 인덱스 업데이트로 인해 프로그램 동작에 영향을 미칠 수 있는 협력적 일정 지점이 도입될 수 있다는 점에 유의하는 것이 중요합니다.
위 내용은 고루틴은 시스템 호출과 함수 호출 이상의 제어를 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!