문제

얼랑으로 알려져 있는 지원할 수 있는 많은 경량 프로세스할 수 있기 때문에 이렇게 이들은 프로세스 전통적인 의미에서,또는 스레드에서 같은 P-스레드,하지만 전적으로 스레드에 사용자 공간입니다.

이뿐만 아니라고 좋은(적인 실제로).하지만 어떻게 다음은 얼랑 스레드를 병렬로 실행에서는 멀티코어/다중 프로세서일까?확실히 그들을 어떻게 든 매핑될 커널에서 스레드를 실행하기 위해서는 별도의 코어?

가정하는 경우,이 약속은 어떻게 이루어졌습니까?많은 라스 프로세스에 매핑된 하나의 커널 쓰레드?

또는 있는 다른 방법으로 이 문제를 해결?

도움이 되었습니까?

해결책

답변은 사용되는 VM에 따라 다릅니다.

1) 비 SMP: 있습니다 하나의 스케줄러 (OS 스레드), 모든 erlang 프로세스를 실행하는 ( 달리는 프로세스 풀 (예 : 차단되지 않은 사람들 receive)

2) SMP: 있습니다 K 스케줄러 (OS 스레드, k는 일반적으로 다수의 CPU 코어입니다). 공유 프로세스 큐. 간단한 FIFO 대기열입니다 (여러 OS 스레드에서 동시에 액세스 할 수있는 잠금 장치가 있음).

3) R13B 및 새로운 SMP:있을 것입니다 K 스케줄러 Erlang 프로세스를 실행하는 (이전과 같이) 여러 프로세스 큐. 각 스케줄러에는 자체 대기열이 있으므로 프로세스에 마이그레이션 논리 한 스케줄러에서 다른 스케줄러로 추가됩니다. 이 솔루션은 공유 프로세스 큐의 과도한 잠금을 피함으로써 성능을 향상시킵니다.

자세한 내용은 참조하십시오 이 문서 Kenneth Lundin, Ericsson AB, 2008 년 11 월 13 일 스톡홀름 Erlang 사용자 컨퍼런스를 위해 준비했습니다.

다른 팁

내가 원하는 조건을 수정하고 이전 답변이 있습니다.

얼랑거나,오히려 얼랑 런타임 시스템(erts)의 기본값은 수의 스케줄러(OS 스레드)수 runqueues 을 수의 처리에 있는 요소의 플랫폼입니다.는 프로세서 코어 또는 하드웨어 스레드입니다.이러한 설정을 변경할 수 있습에서 사용하여 런타임:

erlang:system_flag(schedulers_online, NP) -> PrevNP

얼랑스 프로세스가 없 선호도하여 어떤 스케줄러는 아직이다.로직 균형을 잡는 프로세스 간의 스케줄러는 다음과 같이 두 가지 규칙이 있습니다.1)굶주린 스케줄러는 훔치는 것입니다 작업에서 또 다른 스케줄러입니다.2)마이그레이션 경로를 설정를 밀어의 프로세스 스케줄러에 많이 가진 프로세스를 스케줄러 미만 작동합니다.이것은 보장을 공정성을 감소에서 count(수행 시간)각 프로세스에 대해.

스케줄러는 그러나 잠길 수 있는 특정 처리 요소입니다.이지 않을 수행합니다.자 erts 행 스케줄러->핵심은 선호도를 사용:

erlang:system_flag(scheduler_bind_type, default_bind) -> PrevBind

여러 가지 다른 바인딩 형태에서 찾을 수 있습니다.선호도를 사용하 성능을 크게 향상시킬 수 있습니다 무거운 짐 상황을 기다리고 있습니다.특히 높은 자물쇠 경쟁 상황입니다.또한,리눅스 커널을 처리할 수 없습 hyperthreads 니다.이 있는 경우 hyperthreads 에 플랫폼을 사용하여 이 기능에 얼랑입니다.

나는 여기에서 순전히 추측하고 있지만, 실행을 위해 공통 프로세스 풀에서 프로세스를 선택하는 적은 수의 스레드가 있다고 생각합니다. 프로세스가 차단 작업에 도달하면 실행되는 스레드가 제쳐두고 다른 스레드를 선택합니다. 프로세스를 실행하면 다른 프로세스가 차단 해제되면 새로 차단되지 않은 프로세스가 풀에 배치됩니다. 다른 프로세스를 제공하기 위해 특정 지점에서 차단되지 않더라도 프로세스 실행을 중단 할 수 있다고 생각합니다.

허용 된 답변에 설명 된 내용에 약간의 입력을 추가하고 싶습니다.

Erlang Scheduler는 Erlang 런타임 시스템의 필수 부분이며 OS 스레드 위의 경량 프로세스 개념에 대한 자체 추상화 및 구현을 제공합니다.

각 스케줄러는 단일 OS 스레드 내에서 실행됩니다. 일반적으로 CPU (Cores)만큼 스케줄러가 많은 He 하드웨어에 있습니다 (구성 가능하지만 자연스럽게 스케줄러 수가 하드웨어 코어의 수를 초과 할 때 자연스럽게 많은 값을 가져 오지 않습니다). 시스템은 또한 스케줄러가 OS 스레드 사이에서 점프하지 않도록 구성 될 수도 있습니다.

이제 Erlang 프로세스가 만들어지면 ERTS 및 스케줄러의 책임은 수명주기 및 자원 소비, 메모리 풋 프린트 등을 관리하는 책임입니다.

핵심 구현 세부 사항 중 하나는 각 프로세스가 스케줄러가 런 큐에서 해당 프로세스를 선택할 때 이용 가능한 2000의 시간 예산을 가지고 있다는 것입니다. 시스템의 각 진전 (I/O조차도)에는 예산이 줄어 듭니다. 그것이 실제로 ERTS를 선제 적 멀티 태스킹으로 시스템으로 만드는 것입니다.

Jesper Louis Andersen의 그 주제에 대한 훌륭한 블로그 게시물을 추천합니다. http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html

짧은 대답으로 : Erlang 프로세스는 OS 스레드가 아니며 직접 매핑되지 않습니다. Erlang 스케줄러는 OS 스레드에서 실행되며 프로그래머의 눈 뒤에 세부 사항을 숨기는 더 세밀한 grained erlang 프로세스의 현명한 구현을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top