But that is when the userspace <i>must</i> (and <i>wants</i>) to communicate with the kernel. Ultimately, that&#x27;s the programmer&#x27;s choice. You could easily write a program in Haskell or Go with two lightweight threads that would keep sending ping&#x2F;pong messages to each other, and all the waiting (on locks, channels, etc.) and switching would be implemented in userspace.<p>I don&#x27;t know enough about userspace&#x2F;kernelspace communication, maybe I&#x2F;O (refilling buffers or calling select) and timers are much more lightweight than full thread context switches, but I&#x27;m guessing it&#x27;s still much slower than pure userspace scheduling.