2016-06-21 3 views
6

forkOn을 사용하여 스레드를 생성하는 프로그램이 있다고 가정 해보십시오. 이 시나리오에서는 하스켈 스레드의로드 밸런싱이 다른 기능들 사이에 없을 것입니다. 그렇다면 +RTS -qm의 유무에 관계없이이 프로그램을 실행하는 데 차이가 있습니까?forkOn과 -qm RTS 플래그 사이의 관계는 무엇입니까?

설명서에 따르면 -qm은 스레드 마이그레이션을 비활성화합니다. 이는 forkOn과 비슷한 효과가 있다고 생각합니다. 이 가정에서 나는 맞습니까? 이 점에서 문서가 얼마나 명확한 지 확신하지 못합니다.

답변

4

나는이 주제에 대한 전문가가 아니지만 어쨌든 나는 그것을 줄 것이다.

GHC (Haskell 컴파일러)에는 하나 이상의 HEC (Haskell 실행 컨텍스트, cap 또는 기능이라고도 함)가있을 수 있습니다. 런타임 플래그 +RTS -N <number> 또는 setNumCapabilities 기능을 사용하면 프로그램에서 사용할 수있는 HEC의 수를 정의 할 수 있습니다. 하나의 HEC는 하나의 운영 체제 스레드입니다. 런타임 스케줄러는 HEC 사이에 하스켈 경량 쓰레드를 분배합니다.

forkOn 기능을 사용하면 스레드가 실행 된 HEC를 선택할 수 있습니다. getNumCapabilities은 기능 수 (HEC)를 반환합니다.

스레드 마이그레이션은 하스켈 스레드를 다른 HEC로 마이그레이션 (이동) 할 수 있음을 의미합니다. 런타임 플래그 +RTS -qm은이 스레드 마이그레이션을 비활성화합니다.

문서는 약 forkOn

forkIO처럼을 주장하지만 스레드를 실행해야하는 기능에 지정할 수 있습니다. forkOn 스레드와 달리 forkOn에 의해 생성 된 스레드는 전체 수명 동안 동일한 기능을 유지합니다 (forkIO 스레드는 스케줄링 정책에 따라 기능간에 마이그레이션 할 수 있음).

그래서 forkOn으로 하나의 단일 HEC를 선택하는 것이 가능 스레드가에 달려있다.

이 스레드에 의해

외국 통화를 할 보장 할 수 없습니다한다고 forkIO 비교 특정 OS 쓰레드에 의해; 특정 OS 스레드가 외래 호출을해야하는 경우 대신 forkOS를 사용하십시오.

이제는 forkOn 기능과 +RTS -qm (비활성화 된 스레드 마이그레이션) 같은 것이 있습니까? 아마도 그렇지 않습니다. forkOn 사용자는 Haskell 스레드가 실행되는 HEC를 명시 적으로 선택합니다 (예를 들어, 모든 Haskell 스레드를 동일한 HEC에 넣을 수 있음). +RTS -qmforkIO으로 하스켈 스레드 HECS 사이를 전환하지 않지만, HEC는 forkIO에 의해 산란 하스켈 스레드가 끝나는 알 방법이 없습니다

참조를 :.

관련 문제