线程
单线程结构进程
•传统进程是单线程结构进程
单线程结构进程的问题
•单线程结构进程在并发程序设计上存在的问题
•进程切换开销大
•进程通信开销大
•限制了进程并发的粒度
•降低了并行计算的效率
解决问题的思路
•把进程的两项功能,即“独立分配资源”与“被调度分派执行”分离开来
•进程作为系统资源分配和保护的独立单位,不需要频繁地切换;
•线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换
•线程的出现会减少进程并发执行所付出的时空开销,使得并发粒度更细、并发性更好
多线程结构进程
多线程环境下进程的概念
• 在多线程环境中,进程是操作系统中进行保护和资源分配的独立单位。具有:
•用来容纳进程映像的虚拟地址空间
•对进程、文件和设备的存取保护机制
多线程环境下线程的概念
•线程是进程的一条执行路径,是调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源。它具有:
•线程执行状态
•受保护的线程上下文,当线程不运行时, 用于存储现场信息
•独立的程序指令计数器
•执行堆栈
•容纳局部变量的静态存储器
多线程环境下线程的状态与调度
• 线程状态有运行、就绪和睡眠,无挂起
•与线程状态变化有关的线程操作有:
•孵化、封锁、活化、剥夺、指派、结束
•OS感知线程环境下:
•处理器调度对象是线程
•进程没有三状态(或者说只有挂起状态)
•OS不感知线程环境下:
•处理器调度对象仍是进程
•用户空间中的用户调度程序调度线程
并发多线程程序设计的优点
• 快速线程切换
• 减少(系统)管理开销
•(线程)通信易于实现
• 并行程度提高
• 节省内存空间
内核级线程KLT, Kernel-Level Threads
•线程管理的所有工作由OS内核来做
•OS提供了一个应用程序设计接口API, 供开发者使用KLT
•OS直接调度KLT
内核级线程的特点
•进程中的一个线程被阻塞了,内核能调度同一进程的其它线程占有处理器运行
•多处理器环境中,内核能同时调度同一进程中多个线程并行执行
•内核自身也可用多线程技术实现,能提高操作系统的执行速度和效率
•应用程序线程在用户态运行,线程调度和管理在内核实现,在同一进程中,控制权从一 个线程传送到另一个线程时需要模式切换, 系统开销较大
用户级线程ULT, User-Level Threads
•用户空间运行的线程库,提供多线程应用程序的开发和运行支撑环境
•任何应用程序均需通过线程库进行程序设计,再与线程库连接后运行
•线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在
用户级线程的特点
•所有线程管理数据结构均在进程的用户空间中,线程切换不需要内核模式,能节省模式切换开销和内核的宝贵资源
•允许进程按应用特定需要选择调度算法,甚至根据应用需求裁剪调度算法
•能运行在任何OS上,内核在支持ULT方面不需要做任何工作
•不能利用多处理器的优点,OS调度进程, 仅有一个ULT能执行
•一个ULT的阻塞,将引起整个进程的阻塞
Jacketing技术
•把阻塞式系统调用改造成非阻塞式的
•当线程陷入系统调用时,执行jacketing程序
•由jacketing 程序来检查资源使用情况,以决定是否执行进程切换或传递控制权给另一个线程
参考资料
https://www.icourse163.org/course/NJU-1001571004