Linux支持内核线程,用户进程以及LWP,Linux2.6之后支持线程组概念。
内核线程是内核创建的线程,处理内核事件的,例如kthreadd,ksoftirqd,migration这些都是内核线程。只运行在内核态。
用户进程是用户通过fork创建的程序,有属于自己的资源。
LWP是通过clone创建的进程,由于LWP和父进程会共享部分资源,比如地址空间,文件系统,文件句柄,信号处理函数等,所以把LWP称为轻量级进程。
线程组其实是在task_struct中增加了tgid(thread group id)字段,一般认为Linux通过这种方式支持了线程,其中进程的tgid等于自己的pid,线程的tgid等于进程的pid。
Linux线程库主要有LinuxThreads和NPTL(Native POSIX Thread Library),LinuxThreads逐渐被NPTL取代。
LinuxThreads和NPTL都是1:1的调度模型,用户线程其实就是通过clone创建的LWP。
LinuxThreads是通过管理线程对线程进行管理的,因而在SMP系统上伸缩性较差,并且很多方面不遵循POSIX 标准。
NPTL是Linux 线程库的一个新实现,由于Linux支持了线程组,所以它不需要管理线程,实现也更符合 POSIX 的需求。
参考: