질문에 직접 답하는 대신 멀티 스레딩 하스켈 프로그램을 구현하는 방법에 대한 개념적 모델을 제공하려고합니다. 나는 많은 세부 사항과 복잡성을 무시할 것이다.
운영 체제는 preemptive multithreading을 사용하여 hardware interrupts을 사용하여 여러 개의 "스레드"계산이 동일한 코어에서 동시에 논리적으로 실행될 수 있도록합니다.
운영 체제에서 제공하는 스레드는 중량이 큰 경향이 있습니다. 이들은 특정 유형의 "멀티 스레드"응용 프로그램에 매우 적합하며 Linux와 같은 시스템에서는 기본적으로 여러 프로그램을 동시에 실행할 수있는 동일한 도구 (탁월한 작업)를 제공합니다.
그러나이 스레드는 하스켈 (Haskell)과 같은 고급 언어에서 많은 용도로 사용하기에는 비트 중량이 큽니다. 본질적으로 GHC 런타임은 OS가 코어 위에 스레드를 구현하는 것과 같은 방식으로 OS 스레드 위에 자체 "스레드"를 구현하는 미니 OS로 작동합니다.
하스켈 (Haskell)과 같은 언어가 이러한 방식으로 구현된다고 상상하기 란 개념 상 쉽습니다. Haskell 평가는 "썽크 강제"로 구성됩니다. 썽크는 다른 값 (썽크)에 의존하거나 새로운 썽크를 만들 수있는 계산 단위입니다.
따라서 각각 동시에 썽크를 평가하는 여러 스레드를 상상할 수 있습니다. 하나는 평가받을 썽크 대기열을 만듭니다. 각 스레드는 대기열의 맨을 팝하고 완료 될 때까지 해당 썽크를 평가 한 다음 대기열에서 새 썽 크를 선택합니다. 작업 par
과 그 ilk는 해당 큐에 썽크를 추가하여 새로운 계산을 "촉발"시킬 수 있습니다.
이 모델을 IO 작업으로 확장하는 것은 상상하기가 특히 어렵지 않습니다. 각각 단순하게 순수한 썽크를 강요하는 대신, 우리는 하스켈 계산의 단위가 다소 복잡하다고 상상합니다.
type Spark = (ThreadId,Action)
data Action = Compute Thunk | Perform IOAction
참고 : 같은 런타임 사이비 하스켈이 일이 이런 식으로
우리가 불꽃을 실행하면, 우리는 예외를 찾아 "던져"에 구현되어 생각하지 않는다, 단지 개념 이해를위한 것입니다 그 스레드 ID. 아무 것도 없다고 가정하면 실행은 썽크를 강요하거나 IO 작업을 수행하는 것으로 구성됩니다.
분명히 여기서 나의 설명은 매우 손이 물결 치고 약간의 복잡성을 무시했다. 더 많은 것을 위해 GHC 팀은 Marlow et al.의 "Runic Support for Multicore Haskell"과 같은 우수한 기사를 작성했습니다. 운영 체제의 텍스트 북을보고 싶을 수도 있습니다. 종종 스케줄러를 작성하는 방법에 대해 깊이있는 내용을 다루기 때문입니다.
http://community.haskell.org/~simonmar/papers/conc-ffi.pdf를 읽는 것이 좋을지도 모릅니다.이 문서는 멀티 스레딩 된 Haskell의 구현을 설명하는 훌륭한 작업입니다. 조금 오래되었지만 여전히 관련성이 높습니다. 제목에도 불구하고, 그것은 FFI보다 훨씬 더 중요합니다. –