线程类型
-
内核线程
创建 / 撤消由内核内部需求决定,
不需和用户进程联系起来
共享内核全局数据,具有自己的内核堆栈
能单独被调度且用标准的内核同步机制,可被单独分配到一个处理器上运行
调度不需要经过态的转换并进行地址空间的重新映射,内核线程间上下文切换比在进程间做上下文切换快得多
-
轻量级进程 LWP
内核支持的用户线程,在一个单独的进程中提供多线程控制
这些轻量级进程被单独的调度,可以在多个处理器上运行,每一个轻量级进程都被绑定在一个内核线程上
独立调度并且共享地址空间和进程中的其它资源
但每个 LWP 都应该有自己的程序计数器、寄存器集合、核心栈和用户栈
-
用户线程
如通过线程库实现,提供同步和调度的方法
可在没有内核参与下创建、释放和管理,不消耗内核资源,省去大量系统开销
用户线程的上下文可以在没有内核干预的情况下保存和恢复
每个用户线程都可以有自己的用户堆栈,一块用来保存用户级寄存器上下文以及如信号屏蔽等状态信息的内存区
库通过保存当前线程的堆栈和寄存器内容载入新调度线程的那些内容来实现用户线程之间的调度和上下文切换
内核仍然负责进程的切换,因为只有内核具有修改内存管理寄存器的权力
用户线程不是真正的调度实体,内核对它们一无所知,而只是调度用户线程下的进程或者轻量级进程,这些进程再通过线程库函数来调度它们的线程
当一个进程被抢占时,它的所有用户线程都被抢占,当一个用户线程被阻塞时,它会阻塞下面的轻量级进程,如果进程只有一个轻量级进程,则它的所有用户线程都会被阻塞
pthread 实现
-
Linux2.4 前:LinuxThread
-
Linux2.5 后:NPTL
fork && clone
- 函数: fork,拷贝父进程而创建一个新进程
- 系统调用:clone,为进程创建提供
fork & pthread_create
fork & pthread_create 都调用的 clone
clone系统调用 ,参数包括如 CLONE_VM, CLONE_FILES, CLONE_SIGHAND 等,指定了克隆时需要拷贝的东西
-
fork
调用 clone 时不设置 CLONE_VM
内核看来就是产生了
两个拥有不同内存空间的进程
-
pthread_create
调用 clone 时设置了 CLONE_VM
内核看来就是产生了
两个拥有相同内存空间的进程
通过 clone 的参数共享进程资源,创建出的就是 LWP
所以用户态创建一个新线程,内核态就对应生成一个新进程