The kernel doesn't support threads per se, there's only one process type. Processes may share memory. Libthread is a user level library that allows multiple threads per process, in addition to multiple processes. It also provides typed CSP like channels. As a user of libthread, you can start a thread in the current process threadcreate() or in a new process procreate() Threads created in the same process use cooperative scheduling, i.e, when one yields the processor (implicitly by calling one of the channel functions or explicitly by calling rendezvous) another can run. However these threads are only logicly separate. Since the kernel knows nothing about them, they can only run sequentially on a single CPU. If one calls a blocking system call (read, sleep, etc) none of the others will run. Therefore, a process that wants to make use of multiple processors and/or that wants to allow some threads to block on system calls will use proccreate (which in turn calls rfork) to create threads in multipe processes. You can mix and match; the threads look the same as far as communication is concerned.