Небольшое тестирование на Windows 10 с 4-ядерным процессором показывает результаты:
module Main where
import Control.Monad
import Control.Concurrent
t1 = forever $ print "1"
t2 = forever $ print "2"
main :: IO ()
main = do
t1id <- forkOS t1 -- I tried forkOS and forkIO
t2id <- forkOS t2
getLine
putStrLn "Done"
Для forkIO
и forkOS
требуется опция ghc-options: -threaded
для использования многопоточного исполнения. В обоих случаях я вижу только один процесс ОС, но несколько потоков. В случае forkIO
число потоков равно 4, а в случае forkOS
я получаю только 3. Более интересно количество переключений контекста, оно отличается от упомянутых предложений: в случае forkIO
они есть ( для разных потоков): 480000 и 48 ... а в случае forkOS
они равны примерно 2, 3, 16 для одного и того же периода времени. Это означает, что forkIO
делает больше переключений контекста, чем forkOS
( сотни тысяч против десятков ), и суммарное время выполнения того же ценного эффекта должно быть больше, поэтому forkOS
выглядит более предпочтительным в Windows box .
Как я вижу в исходном коде GHC, потоки POSIX используются под капотом.
EDIT . Тест Linux (ps -eLf
):
forkOS:
UID PID PPID LWP C NLWP STIME TTY TIME CMD
... ... ... ... ... ... ... ... ... ...
xyz 7432 4865 7432 0 7 10:03 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 7432 4865 7448 0 7 10:03 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 7432 4865 7449 0 7 10:03 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 7432 4865 7450 0 7 10:03 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 7432 4865 7451 66 7 10:03 pts/0 00:00:06 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 7432 4865 7452 0 7 10:03 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 7432 4865 7453 67 7 10:03 pts/0 00:00:06 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
forkIO:
UID PID PPID LWP C NLWP STIME TTY TIME CMD
... ... ... ... ... ... ... ... ... ...
xyz 8209 4865 8209 0 6 10:08 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 8209 4865 8225 0 6 10:08 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 8209 4865 8226 0 6 10:08 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 8209 4865 8227 0 6 10:08 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 8209 4865 8228 99 6 10:08 pts/0 00:00:06 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
xyz 8209 4865 8229 0 6 10:08 pts/0 00:00:00 /home/xyz/prj/thr/.stack-work/install/x86_64-linux-tinfo6/lts-13.25/8.6.5/bin/yohoho
В Linux в forkIO
случае у нас всего 6 LWP, и один из них использует процессор на 99%. В случае forkOS
у нас есть 7 LWP, и 2 из них используют CPU примерно на 66%, что, на мой взгляд, выглядит лучше. Похоже, что forkOS
предпочтительнее и в Linux.