线程的实现
线程的实现方式
1. 内核支持线程KST(Kernel supported threads)
- 内核支持线程同进程一样都是在内核支持下运行的, 与内核密切相关
- 创建, 阻塞, 撤销, 切换都是在内核空间实现的
- 内核空间中为每一个线程设置了一个线程控制块, 内核通过线程控制块对其进行控制
优点
- 在多处理器系统中内核可以同时调度同一进程中的多个线程并发执行
- 如果进程中的一个线程阻塞了, 内核可继续调度该进程中的其他线程
缺点
- 同一进程中切换线程开销较大, 因为要经历用户态, 内核态的切换
2. 用户级线程ULT(User level threads)
- 用户级线程与内核无关
- 创建, 撤销, 同步和通信等功能都是在用户空间中实现的.
- 调度以进程为单位
优点
- 线程切换不需要转换内核状态, 节省了切换的开销
- 不同的进程可根据自身选择不同的调度算法
- 用户级线程的实现与OS平台无关
缺点
- 当一个线程阻塞时, 其他所有的线程都被阻塞
- 不能利用多处理机的优点
3. 组合方式
将以上两种线程的方式结合, 形成组合方式线程.
组合方式线程支持多个内核支持线程和用户级线程的建立, 调度和管理.
结合上述两种线程的优点, 形成了三种不同的模型
1. 多对一模型
将用户线程映射到一个内核控制线程, 当用户线程需要访问内核时, 将其映射到一个内核线程, 但每次只允许一个线程进行映射.主要的优点是开销小, 效率高, 缺点在于一个线程在访问内核时发生阻塞, 则整个进程都会被阻塞. 且同一时刻只有一个线程可以访问内核
2. 一对一模型
每一个用户级线程都映射到一个内核控制线程. 主要的优点是当一个线程阻塞, 允许其他线程继续运行. 且允许多个线程并行地运行在多处理机系统上. 缺点是开销较大
3. 多对多模型
将多个用户线程映射到同样数量或者更少数量的内核线程上,可以根据实际情况调整内核控制线程数目, 结合了上述两种模型的优点.