A traditional process has only one set of CPU registers associated with it. A multi-threaded process would have more than one.
Threads execute independently of each other, and communicate only through the shared memory.
Kernel threads are known to the scheduler. User level threads, or coroutine threads, are not known to the scheduler. Thus, if one thread invokes a syscall that blocks, all threads are stopped. With kernel threads, no explicit yielding is needed, since the threads may indeed run on separate processors and in any case the kernel manages the thread switching. Assignment 6 Due Dec 3rd, before class as per usual.