안녕 고 면접관 : GMP 모델, 왜 P가 있나요?
오늘의 주인공은 바둑 인터뷰에서 나온 만능 GMP 모델 질문의 확장 질문(질문)입니다. 바로 "GMP 모델, 왜 P이 필요한가요?"
더 자세히 알아보겠습니다. 사실 이 인터뷰에서 질문의 본질은 "GMP 모델에서는 왜 G와 M을 직접 묶을 수 없는 걸까요? 너무 번거롭습니다. 왜 그렇게 번거롭습니까? 무슨 문제입니까?"라고 묻는 것입니다. 문제를 해결하려고 하시나요?"
이 기사에서는 GM 및 GMP 모델의 변경 이유를 살펴보겠습니다.Go1.1 이전에는 Go의 스케줄링 모델이 실제로는 GM 모델, 즉 P가 없었습니다. 오늘은 과거 디자인 리뷰로 여러분을 초대하겠습니다.
뭔가를 이해하는 방법 중 하나는 Go1.0.1 스케줄러 소스 코드의 핵심 핵심 단계를 살펴보는 것입니다. 지안위:
static void schedule(G *gp) { ... schedlock(); if(gp != nil) { ... switch(gp->status){ case Grunnable: case Gdead: // Shouldn't have been running! runtime·throw("bad gp->status in sched"); case Grunning: gp->status = Grunnable; gput(gp); break; } gp = nextgandunlock(); gp->readyonstop = 0; gp->status = Grunning; m->curg = gp; gp->m = m; ... runtime·gogo(&gp->sched, 0); }
Call schedlock
가져오기 방법 글로벌 잠금.schedlock
方法来获取全局锁。获取全局锁成功后,将当前 Goroutine 状态从 Running(正在被调度) 状态修改为 Runnable(可以被调度)状态。 调用 gput
方法来保存当前 Goroutine 的运行状态等信息,以便于后续的使用。调用 nextgandunlock
方法来寻找下一个可运行 Goroutine,并且释放全局锁给其他调度使用。获取到下一个待运行的 Goroutine 后,将其运行状态修改为 Running。 调用 runtime·gogo
전화
nextgandunlock
찾기 방법 다음 고루틴이 실행될 수 있으며 다른 스케줄러가 사용할 수 있도록 전역 잠금이 해제됩니다. 
전화 런타임·gogo
메소드 , 방금 얻은 다음 실행할 고루틴을 실행하고 다음 스케줄링 라운드에 들어갑니다.
GM 모델에 대한 생각
Go1.0.1의 스케줄러 소스코드를 분석해보면 흥미로운 점을 발견할 수 있습니다. 이는 스케줄러 자체(스케줄 방식)입니다. 일반 프로세스에서는 반환되지 않습니다. 즉, 기본 프로세스가 종료되지 않습니다.
🎜🎜🎜G-M 모델 다이어그램🎜🎜🎜 GoroutineA가 완료된 후 GoroutineB를 찾기 시작합니다. B가 발견되면 A의 완료된 스케줄링 권한이 B에 넘겨져 GoroutineB가 됩니다. 스케줄링, 즉 실행 중이 되기 시작합니다. 🎜🎜물론 차단(Blocked)된 G도 있습니다. G가 일부 시스템이나 네트워크 호출을 하고 있어 G가 정지하게 된다고 가정합니다. 이때 M(시스템 스레드)은 커널 큐에 다시 배치되어 새로운 깨우기 라운드를 기다립니다. 🎜🎜🎜🎜GM 모델의 단점🎜🎜🎜🎜GM 모델은 표면적으로는 부서지지 않고 흠 하나 없는 것처럼 보입니다. 그런데 왜 바꾸나요? 🎜🎜Dmitry Vyukov는 2012년에 Go Scheduler에 대한 주요 연구 논문의 주요 대상인 "Scalable Go Scheduler Design Doc"이라는 논문을 발표했습니다. 그는 논문에서 전반적인 이유와 고려 사항을 설명했습니다. . 🎜현재 Goroutine 스케줄러(Go 1.0의 GM 모델 참조)는 Go로 작성된 동시 프로그램, 특히 처리량이 높은 서버 및 병렬 컴퓨팅 프로그램의 확장성을 제한합니다.
구현에는 다음과 같은 문제가 있습니다.
단일 전역 뮤텍스(Sched.Lock)와 중앙 집중식 상태 관리가 있습니다. 뮤텍스는 모든 고루틴 관련 작업(생성, 완료, 재정렬, 등), 심각한 잠금 경쟁으로 이어집니다. 고루틴 전달 문제: 고루틴(G) 핸드오버(G.nextg): 실행 가능한 고루틴은 종종 작업자 스레드(M's) 간에 전달됩니다. 위로 인해 지연 시간이 늘어나고 추가 오버헤드가 발생할 수 있습니다. 모든 M은 실행 가능한 G, 특히 방금 G를 생성한 M을 실행할 수 있어야 합니다. 각 M은 메모리(M.mcache)에 캐시되어야 합니다. 과도한 리소스 소비(각 mcache는 2M의 메모리 캐시 및 기타 캐시를 흡수할 수 있음)와 열악한 데이터 지역성을 초래합니다. 잦은 스레드 차단/차단 해제: 스레드는 syscall이 있는 경우 자주 차단되고 차단 해제됩니다. 이는 추가 성능 오버헤드를 많이 추가합니다.
GMP 모델
위의 GM 모델의 많은 문제를 해결하기 위해 Go1.1에서 Dmitry Vyukov는 GM 모델을 기반으로 하는 새로운 P(Processor) 구성 요소를 추가했습니다. 그리고 새롭게 발생한 일부 문제를 해결하기 위해 Work Stealing 알고리즘을 구현했습니다.

GMP 모델은 이전 기사 "Go 그룹 친구들이 물었습니다: 제어할 적절한 고루틴 수는 얼마입니까? 이것이 GC와 스케줄링에 영향을 미칠까요?" "에 설명되어 있습니다.
좋다고 생각하는 친구들은 주목해도 좋고 여기서는 반복하지 않겠습니다.
어떤 변화를 가져올까요
P를 추가하면 어떤 변화가 생길까요? 좀 더 명확하게 얘기해보자.
각 P에는 자체 로컬 큐가 있어 글로벌 큐에 대한 직접적인 의존도가 크게 줄어듭니다. 결과적으로 잠금 경쟁이 줄어듭니다. GM 모델의 성능 오버헤드의 대부분은 잠금 경쟁입니다.
각 P의 상대적 균형에 따라 GMP 모델에도 작업 스틸링 알고리즘이 구현되어 있습니다. P의 로컬 큐가 비어 있으면 실행 가능한 G가 글로벌 큐 또는 로컬 큐에서 도난당합니다. 다른 P를 실행하여 유휴 상태를 줄이고 리소스 활용도를 향상시킵니다.
왜 P
이때 헷갈려하는 친구들도 있을텐데, 로컬 큐와 Work Stealing 알고리즘을 구현하고 싶다면 직접 M에 추가하면 되지 않을까요? M의 경우 유사한 기능을 얻을 수 있습니다 .
다른 P 구성 요소를 추가하는 이유는 무엇입니까?
M(시스템 스레드)의 위치 지정과 결합하여 이렇게 하면 다음과 같은 문제가 발생합니다.
일반적으로 M의 수가 P보다 많을 것입니다. Go와 마찬가지로 M 개수의 최대 제한은 10000이고, P의 기본 개수는 CPU 코어 개수입니다. 또한 M의 속성으로 인해, 즉 M을 차단하는 시스템 차단 호출이 있어 충분하지 않은 경우에도 M은 계속 증가하게 됩니다.
M이 계속 증가하면 로컬 큐가 M에 마운트되면 로컬 큐도 증가한다는 의미입니다. 로컬 큐 관리가 복잡해지고 Work Stealing 성능이 크게 저하되므로 이는 명백히 불합리합니다.
M 시스템 호출에 의해 차단된 후, 차단되자마자 모든 것을 중지시키는 것이 아니라 실행되지 않은 작업을 다른 사람에게 할당하여 계속 실행되기를 바랍니다.
그러므로 M을 사용하는 것은 무리입니다. 그러면 새로운 컴포넌트 P를 도입하고 로컬 큐를 P에 연결하면 이 문제를 아주 잘 해결할 수 있습니다.
요약
오늘의 글은 Go 언어 스케줄러 전체에 대한 몇 가지 역사적 상황, 원인 분석 및 해결 방법 설명을 결합한 것입니다.
"GMP 모델, 왜 P가 있지?" 이 질문은 시스템 설계 이해와도 같습니다. 이제 많은 사람들이 인터뷰에 응하기 위해 GMP 모델을 외우거나 즉석에서 통과하게 될 것이기 때문입니다. 그리고 그 이면의 실제 이유를 이해하는 것이 우리가 배우고 이해해야 할 것입니다.
무슨 일이 일어나고 있고 왜 일어나는지 알아야만 상황을 깨뜨릴 수 있습니다.
위 내용은 안녕 고 면접관 : GMP 모델, 왜 P가 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 및 GMP를 사용하여 큰 정수에 대해 RSA 암호화 및 암호 해독 알고리즘을 수행하는 방법 RSA 암호화 알고리즘은 데이터 보안 분야에서 널리 사용되는 비대칭 암호화 알고리즘입니다. 특히 큰 두 개의 소수와 몇 가지 간단한 수학적 연산을 기반으로 공개 키 암호화 및 개인 키 암호 해독 프로세스를 구현합니다. PHP 언어에서는 GMP(GNUMultiplePrecision) 라이브러리를 통해 큰 정수 계산을 구현하고, RSA 알고리즘을 결합해 암복호화 기능을 구현한다. 이 기사에서는 PHP 및 GMP 라이브러리를 사용하여 다음을 수행하는 방법을 소개합니다.

"GMP 모델, 왜 P가 있나요?" 이 질문은 시스템 설계 이해와도 같습니다. 이제 많은 사람들이 인터뷰에 응하기 위해 GMP 모델을 외우거나 즉석에서 통과하게 될 것이기 때문입니다. 그리고 그 이면의 실제 이유를 이해하는 것이 우리가 배우고 이해해야 할 것입니다.

php gmp 컴파일 및 설치 방법: 1. "bzip2 -d gcc-4.1.0.tar.bz2"를 통해 php 패키지의 압축을 푼다. 2. "tar -xvf gcc-4.1.0.tar" 또는 "tar -xvf"를 실행합니다. *.tar" 명령; 3. "make install"을 통해 gmp를 설치합니다.

PHP와 GMP를 사용하여 RSA 암호화 및 복호화 알고리즘을 구현하는 방법 RSA 암호화 알고리즘은 정보 보안 분야에서 널리 사용되는 비대칭 암호화 알고리즘입니다. 실제 응용에서는 RSA 암호화 및 복호화 알고리즘을 구현하기 위해 프로그래밍 언어를 사용해야 하는 경우가 많습니다. PHP는 일반적으로 사용되는 서버측 스크립팅 언어이고, GMP(GNUMultiplePrecision)는 RSA 알고리즘에 필요한 많은 연산을 수행하는 데 도움을 줄 수 있는 고정밀 수학 계산 라이브러리입니다. 이 기사에서는 PHP와 GMP를 사용하는 방법을 소개합니다.

PHP와 GMP를 사용하여 큰 숫자의 빠른 곱셈을 구현하는 방법 소개: 컴퓨터 과학에서 정수 산술은 가장 기본적이고 일반적으로 사용되는 연산 중 하나입니다. 그러나 큰 정수가 포함되면 기존 산술 방법은 비효율적이 됩니다. 이 기사에서는 PHP에서 GMP(GNUMultiplePrecision) 라이브러리를 사용하여 큰 수의 빠른 곱셈을 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다. GMP 라이브러리 소개 GMP 라이브러리는 큰 정수의 덧셈, 뺄셈, 곱셈, 나눗셈, 지수화 등의 기능을 제공하는 고정밀 계산 라이브러리입니다.

PHP 및 GMP를 사용하여 큰 소수를 생성하는 방법 소개: 암호화 및 보안 분야에서는 큰 소수를 무작위로 생성하는 것이 매우 중요합니다. PHP의 GMP(GNUMultiplePrecision) 확장은 필요한 큰 소수를 생성하는 데 사용할 수 있는 고정밀 계산 기능을 제공합니다. 이 기사에서는 PHP와 GMP를 사용하여 큰 소수를 생성하는 방법을 소개하고 해당 코드 예제를 제공합니다. 1단계: GMP 확장 설치 먼저, GMP 확장이 서버에 설치되어 활성화되어 있는지 확인해야 합니다. 이 작업은 다음을 통해 수행할 수 있습니다.

처음부터 끝까지: PHP를 사용하여 큰 숫자의 작업을 위해 GMP를 확장하는 방법 인터넷이 발전하면서 빅 데이터 처리는 일상적인 개발에서 없어서는 안 될 부분이 되었습니다. 많은 시나리오에서 우리는 PHP의 정수 범위(-2^31-1 ~ 2^31-1)보다 큰 숫자를 처리해야 합니다. 이 경우 PHP의 GMP 확장이 유용합니다. GMP(GNUMultiplePrecisionArithmeticLibrary)는

PHP 및 GMP 튜토리얼: 큰 숫자의 최소 공배수를 계산하는 방법 소개: 컴퓨터에서는 큰 숫자 연산을 처리해야 하는 경우가 많습니다. 그러나 컴퓨터 저장 공간의 제한으로 인해 기존 정수 유형은 특정 범위를 넘는 숫자를 처리할 수 없습니다. 이 문제를 해결하기 위해 우리는 PHP의 GMP(GNUMultiplePrecision) 라이브러리를 사용하여 많은 수의 연산을 수행할 수 있습니다. 이 기사에서는 PHP와 GMP 라이브러리를 사용하여 두 개의 큰 숫자의 최소 공배수를 계산하는 방법을 소개합니다. 최소 공배수는 무엇입니까? 막내 남자
