Incidentally, the reason the Linux kernel assigns a separate "Process
ID" to each thread is because inside the kernal, they're scheduled the
same (the 1:1 thread model). And in fact, from what I've read the
kernel does not have a binary distinction between "processes" and
"threads", but rather a much more flexible continuum between the two -
not just "shared nothing" processes and "shared everything" threads,
but various types of "shared this but not that" in between. Perhaps
they use that internally in the kernel, but you won't see it in any
user-level threading libraries anytime soon, because unlike POSIX
processes and threads, those features are strictly Linux-specific.