We can identify two types of threads in contemporary operating systems: user threads and kernel threads.
User threads are those coded by programmers and are used in user programs. Example: a multi-threaded Java program consists of user threads.
Kernel threads are internal threads that the operating system decides to create for simultaneous, and therefore efficient, execution of OS code.
Since user programs will resort to kernel services, we need to figure out how user threads will eventually be mapped to kernel threads. We describe three mapping models.