User level library code provides a substantial part of the thread implementation.
However, the operating system views a multithreaded user program (using this user library) as being a single threaded process and schedules the process.
The user library must provide its own scheduler to schedule the multiple threads within this process.
Advantage: Since the thread library schedules and synchronizes the multiple threads within the process, the overhead of system calls is avoided.
Disadvantage: If some thread in the process makes a system call (not one of the thread library calls) and blocks, then none of other threads will execute even if they are "runnable".
This model is referred to as having a single "kernel" thread. Presumably this just means that the operating system views the process as being a single threaded process and the kernel only keeps track of scheduling the process.