Scheduler activations allow for fast user-level thread management while also enabling real thread parallelism on multiprocessors. With scheduler activations, the kernel scheduler uses upcalls to notify the user-level scheduler of scheduling events like new, preempted, blocked, and unblocked threads. This allows the user-level scheduler to maintain thread parallelism by scheduling another user-level thread when one blocks. The number of activations, which approximate kernel threads, can equal the number of CPUs.