Haskell 경량 스레드 오버 헤드 및 멀티 코어에서 사용
동시성과 병렬성에 관한 장인 "Real World Haskell"책을 읽고 있습니다. 내 질문은 다음과 같습니다.
Haskell 스레드는 실제로 하나의 "실제"OS 스레드 내에있는 여러 "가상"스레드이기 때문에 많은 스레드 (예 : 1000 개)를 생성해도 성능에 큰 영향을주지 않을까요? 즉, Haskell 스레드를 만들 때 발생하는 오버 헤드
forkIO
가 (거의) 무시할 만하다고 말할 수 있습니까? 가능하면 평화로운 예를 가져 오십시오.경량 스레드의 개념이 멀티 코어 아키텍처의 장점을 사용하는 것을 방해하지 않습니까? 내가 이해했듯이 두 개의 Haskell 스레드가 두 개의 개별 코어에서 동시에 실행되는 것은 불가능합니다. 왜냐하면 실제로 운영 체제의 관점에서 볼 때 하나의 단일 스레드이기 때문입니다. 아니면 Haskell 런타임이 여러 CPU를 사용할 수 있도록 몇 가지 영리한 트릭을 수행합니까?
GHC의 런타임은 여러 하드웨어 코어에 분산 될 수있는 수십억 개의 스파크, 수천 개의 경량 스레드를 지원하는 실행 환경을 제공합니다. 플래그로 컴파일 -threaded
하고 사용 +RTS -N4
하여 원하는 코어 수를 설정합니다.
구체적으로 특별히:
1000 개와 같이 많은 수를 생성해도 성능에 큰 영향을주지 않는다는 의미입니까?
음, 1,000,000 개를 만드는 것은 확실히 가능합니다. 1000은 너무 싸서 나타나지 않을 것입니다. "스레드 링"과 같은 스레드 생성 벤치 마크에서 GHC가 매우 훌륭하다는 것을 알 수 있습니다.
경량 스레드의 개념이 멀티 코어 아키텍처의 장점을 사용하는 것을 방해하지 않습니까?
전혀. GHC는 2004 년부터 멀티 코어에서 실행 되고 있습니다. 멀티 코어 런타임의 현재 상태는 여기에서 추적됩니다.
어떻게하나요? 이 아키텍처에 대해 읽어 볼 수있는 가장 좋은 곳은 "Runtime Support for Multicore Haskell"문서입니다 .
GHC 런타임 시스템은 각 물리적 CPU에 대해 대략 하나씩, 소수의 운영 체제 스레드로 멀티플렉싱하여 수백만 개의 경량 스레드를 지원합니다. ...
Haskell 스레드는 작업자 스레드라고하는 운영 체제 스레드 집합에 의해 실행됩니다. 우리는 물리적 CPU 당 대략 하나의 작업자 스레드를 유지하지만 정확히 어떤 작업자 스레드가 매순간 다를 수 있습니다.
작업자 스레드가 변경 될 수 있으므로 각 CPU에 대해 정확히 하나의 HEC (Haskell Execution Context)를 유지합니다. HEC는 Haskell 스레드를 실행하기 위해 OS 작업자 스레드가 필요로하는 모든 데이터를 포함하는 데이터 구조입니다.
스레드 범위를 통해 생성중인 스레드와 스레드가 실행되는 위치를 모니터링 할 수 있습니다 . . 예를 들어 바이너리 트리 벤치 마크를 실행합니다.
Warp 웹 서버는 이러한 경량 스레드를 광범위하게 사용하여 정말 좋은 성능 을 얻 습니다 . 다른 Haskell 웹 서버도 경쟁을 주도하고 있습니다. 이것은 "Warp is good"보다 "Haskell is good"에 가깝습니다.
Haskell은 여러 시스템 스레드에 경량 스레드를 배포 할 수있는 다중 스레드 런타임을 제공합니다. 최대 4 개의 코어에서 매우 잘 작동합니다. 과거에는 몇 가지 성능 문제가 있지만 적극적으로 작업 중입니다.
1000 개의 프로세스를 만드는 것은 비교적 가볍습니다. 그것에 대해 걱정하지 마십시오. 성능에 관해서는 벤치마킹 만하면됩니다.
이전에 지적했듯이 다중 코어는 잘 작동합니다. 여러 개의 Haskell 스레드가 다른 OS 스레드에서 예약되어 동시에 실행될 수 있습니다.
'programing tip' 카테고리의 다른 글
파이썬에서 즉시 변수 이름 생성 (0) | 2020.12.12 |
---|---|
Git을 사용하여 두 가지 브랜치에 커밋 푸시 (0) | 2020.12.12 |
SQL Server : 여러 행을 하나의 행으로 결합 (0) | 2020.12.12 |
PHP 알림 : 정의되지 않은 오프셋 : 데이터를 읽을 때 배열이있는 1 (0) | 2020.12.11 |
IB Designable의 인스턴스를 렌더링하지 못했습니다. (0) | 2020.12.11 |