2.6 线程
进程分为两个组成部分
- 调度的基本单位
- 资源的独立单元
线程作为基本调度单位独立出来,由OS调度
多线程
单个进程内支持多个并发路径的能力
单线程
一个进程只有一个线程
线程是进程中的一个实体,是独立调度和分派的单元
2.6.1 进程vs线程
一个进程可以有一个或多个线程
挂起或终止一个进程=挂起或终止其内部所有线程
线程
- 执行状态state:派生、阻塞、解除阻塞、结束
- 上下文context
- 栈
- 局部变量
- 共享的资源和内存
多线程比单线程多一个tcb(线程的“pcb”)
线程优点
- 创建耗时短
- 终止耗时短
- 切换耗时短(同进程内)
- 提高了不同执行程序间的通信效率
线程同步
- 一个进程中的所有线程共享该进程数据和空间
- 一个线程对数据修改会影响其他线程
2.6.2线程分类
用户级线程 ULT(User-Level Thread)
- 线程内核不可见,由应用程序管理
- 进程阻塞,线程不一定阻塞;进程运行,线程也可能阻塞
- 优点
- 线程切换不需要切换内核模式
- 调度策略可以应用程序定制
- 可运行在任何种类的OS上
- 缺点
- 线程系统调用时会阻塞该进程所有线程
- 不适用于多核系统
- 缺点的改进办法
- jacketing技术:由应用级调用替代系统调用
内核级线程 KLT(Kernel level Thread)
- 内核管理线程,应用程序不管理线程
- 优点
- 可以将多个线程分配到多个cpu上
- 一个线程阻塞时,同进程其他线程不会阻塞
- 内核本身也可以使用多线程
- 缺点
- 线程切换要进行模式切换
混合方法(ULT+KLT)
- 线程在用户级创建
- 线程调度、同步由应用程序完成
- 用户线程一个或多个映射到内核线程上(内核线程要更少)