3 ms·
GHC uses pre-emptive thread switching, not co-operative thread switching. Threads are forced by the runtime to be switched out -- they have no choice in the mat
by dons 14y ago
GHC uses pre-emptive thread switching, not co-operative thread switching. Threads are forced by the runtime to be switched out -- they have no choice in the matter -- based on rts interrupts.
Typically, threads will be switched when they allocate.
See
https://github.com/ghc/ghc/blob/master/rts/Schedule.c#L208 https://github.com/ghc/ghc/blob/master/rts/Schedule.c#L208
and for low-level fun:
https://github.com/ghc/ghc/blob/master/includes/stg/SMP.h https://github.com/ghc/ghc/blob/master/includes/stg/SMP.h
- exDM69 14y ago> GHC uses pre-emptive thread switching, not co-operative thread switching. > Threads may be switched when they allocate. If threads are scheduled in and out when they allocate memory or are about to issue a possibly blocking system call, it's called co-operative multithreading, isn't it? If the thread execution was stopped using external means like a timer interrupt, that would be pre-emptive. Some definitions of pre-emptive involve the ability to stop a lower priority thread in favor of a higher priority thread that becomes ready when a syscall is finished. The best I understand the situation, Haskell's green threads voluntarily (co-operatively) give up their time slice (for another green thread) when allocating memory or doing I/O. Haskell's green threads run on top of several native threads that are pre-emptively scheduled by the operating system. Please correct me if I'm wrong.
- dons 14y agoThe threads do not volunteer. They are pre-empted by an external authority - the runtime system. They have no choice in the matter.