In the book "UNIX Internals", it says:
Is it still the case for freebsd?The kernel retains the responsibility for process switching, because it alone has the privilege
to modify the memory management registers. User threads are not truly schedulable entities, and the
kernel has no knowledge of them. The kernel simply schedules the underlying process or LWP,
which in turn uses library functions to schedule its threads. When the process or LWP is preempted,
so are its threads. Likewise, if a user thread makes a blocking system call, it blocks the underlying
LWP. If the process has only one LWP (or if the user threads are implemented on a single-threaded
system), all its threads are blocked.