线程环境
单线程结构的问题
进程切换开销大、进程通信开销大,限制了进程并发的速度,降低了并行计算的效率
解决思路:将进程的资源属性与调度属性分离。
多线程环境
多线程环境下,进程是保护和资源分配的独立单位。
线程是调度的基本单位,同一个进程内的所有线程共享进程的主存空间和资源。线程包括:
- 执行状态
- 受保护的线程上下文
- 独立的程序计数器
- 堆栈
- 容纳局部变量的静态存储区
线程状态与调度
线程状态有运行、就绪和睡眠,无挂起。
相关的线程操作有:孵化、封锁、活化、剥夺、指派、结束
OS感知线程环境下:
- 处理器以线程进行调度
- 进程没有三状态(只有挂起状态)
OS不感知线程环境下:
- 处理器以进程进行调度
- 用户空间的用户调度程序调度线程
多线程实现
内核级线程KLT
线程管理的所有工作由OS内核进行。OS提供API供开发者使用。
OS直接调度KLT。
KLT适用于解决物理并行性问题。
特点
- 进程中一个线程阻塞,内核可用调度同一进程的其他线程执行
- 多处理器环境中,内核可以同时调度同一进程的多个线程并行执行
- 内核自身可以多线程实现,提供操作系统速度与效率
- 同一进程中线程切换需要模式切换,系统开销大
用户级线程ULT
用户空间运行的线程库。线程管理的所有工作由应用程序完成,内核没有意识到线程的存在。
ULT适用于解决逻辑并行性问题、
特点
- 线程切换不需要内核模式,能节省模式切换开销和内核资源
- 允许应用程序根据特定需要选择和剪裁调度算法
- 能运行在任何操作系统上
- 不能利用多处理器优点
- 一个ULT的阻塞会阻塞整个进程
Jacketing技术
把阻塞式系统改造成非阻塞式的。当线程陷入系统调用时,执行jacketing程序,检查资源使用情况,以决定是否进行进程切换或线程切换。
混合式策略
用户空间完成线程创建,ULT和KLT多对多映射
特点
- 组合用户级线程/内核级线程设施
- 线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行
- 一个应用中的多个用户级线程被映射到一些(小于等于用户级线程数目)内核级线程上
- 程序员可以针对特定应用和机器调节内核级线程的数目,以达到整体最佳结果
- 该方法将会结合纯粹用户级线程方法和内核级线程方法的优点,同时减少它们的缺点
线程状态
活跃的ULT代表绑定KLT的三态
活跃态ULT运行时和激活用户调度
非阻塞系统调用可使用Jacketing启动用户调度,调整活跃态ULT