Я попытался выяснить, как именно потоки Haskell (те, которые порождаются forkIO), сопоставлены с потоками ОС.
Первый источник информации, который я нашел,
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html#g:11
указывает, что все легкие потоки фактически выполняются в одном потоке ОС и только тогда, когда потоки Haskell блокируются с безопасной операцией ввода-вывода, среда выполнения GHC порождает новый поток ОС для запуска других потоков Haskell, так что вызов IO не " t заблокировать всю программу.
Второй источник информации приходит отсюда,
http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/using-smp.html
в котором четко указано, что потоки Haskell сопоставляются с предопределенным количеством заранее созданных потоков ОС сбалансированным образом. Это означает более или менее то, что если у меня будет 80 легких потоков, и я прошел бы в опции + RTS -N 8 при запуске моей программы, тогда будет создано не менее 8 потоков ОС, и каждый такой поток будет запускать 10 легких потоков. На машине с 8 ядрами процессора, что будет означать примерно 10 потоков/ядра Haskell.
Второй источник информации кажется более точным, и именно это поведение, которое я желаю, чтобы среда выполнения GHC проявлялась при запуске программы, скомпилированной с флагом -threaded
.
Может ли кто-нибудь подтвердить это? А также, если вторая версия является правильной, какова цель связанного потока - тот, который создается с помощью forkOS - это только для обработки собственных код, который использует локальные данные потока?