文章目录
1、线程
(1)单线程的缺点
单线程结构进程给并发程序设计效率带来问题:
- 进程切换开销大(进程是资源的拥有者)
- 进程通信代价大,每次通信均要涉及通信进程之间或通信进程与操作系统之间的信息传递
- 进程之间的并发性粒度较粗,并发度不高,过多的进程切换和通信延迟使得细粒度的并发得不偿失
- 不适合并行计算和分布并行计算的要求
- 不适合客户/服务器计算的要求
(2)引入进程和线程的目的
-
引入进程的目的:
为了使多个程序并发执行,以改善资源使用率和提高系统效率 -
引入线程的目的:
为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好
(3)比起进程,线程的优点
- 快速线程切换
- 通信易于实现
- 减少管理开销
- 并发程度高
(4)在多线程进程中,每个线程具有
- 独立堆栈
- 现场信息
- 其它状态信息与线程控制块TCB(Thread Control Block)
- 一个进程中的所有线程共享其所属进程拥有的资源,它们驻留在相同的地址空间,可以存取相同的数据
2、多线程
(1)多线程中的进程
进程是操作系统中进行保护和资源分配的基本单位,具有:
- 一个虚拟地址空间,用来容纳进程的映像
- 对处理器、其他(通信的)进程、文件和I/O资源等的有控制有保护的访问
传统进程原先所承担的控制流执行任务交给称作线程的部分完成
(2)多线程中的线程
线程是操作系统进程中能够独立执行的实体(控制流)
- 是处理器调度和分派的基本单位
- 是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程
- 同一进程中的所有线程共享进程的主存空间和资源,但不拥有资源
(3)线程属性
- 结构性:线程具有唯一的标识符和线程控制块,其中包含调度所需的一切私有信息
- 共享性:同一进程中的所有线程共享但不拥有进程的状态和资源,且驻留在进程的同一个主存地址空间中,可以访问相同的数据
- 动态性:线程是程序在相应数据集上的一次执行过程,由创建而产生,直到由撤消而消亡,有其生命周期。每个进程被创建时,至少同时为其创建一个线程,需要时线程可以再创建其它线程
- 并行性:同一进程的多个线程可在一个/多个处理器上并发或并行地执行,而进程之间的并发执行演变为不同进程的线程之间的并发执行
(4)进程和线程的封装
进程可以划分为两个部分:资源集合和线程集合
-
进程封装了管理信息,进程要支撑线程运行,为线程提供地址空间和各种资源。包括对指令代码、全局数据和I/O状态数据等共享部分的管理
-
线程封装了执行信息,包括对CPU寄存器、执行栈(用户栈、内核栈)和局部变量、过程调用参数、返回值等线程私有部分的管理
3、线程的组织方式
- 调度员/工作者模式
- 组模式:
- 流水线模式:
4、线程的实现
从实现的角度看,线程可以分成:
- 用户级线程 ULT(如Java,Informix)
- 内核级线程 KLT(如Windows2000/XP、OS/2),分别在用户空间和内核空间实现
- 混合式线程(如,Solaris),同时支持两种线程实现
(1)内核级线程
- 在纯内核级线程设施中,线程管理的所有工作由操作系统内核做。内核专门提供KLT 应用程序设计接口API供开发者使用,应用程序区不需要有线程管理代码。
- Windows NT 和 OS/2都是采用这种方法的例子。线程执行中可通过内核创建线程原语来创建其他线程,这个应用的所有线程均在一个进程中获得支持。
- 内核要为整个进程及进程中的单个线程维护现场信息,应在内核中建立和维护PCB及TCB,内核的调度是在线程的基础上进行的
优缺点:
-
多处理器上,内核能同时调度同一进程中多个线程并行执行进程中的一个线程被阻塞了,内核能调度同一进程的其它线程或其他进程中的线程占有处理器运行
-
内核线程数据结构和堆栈很小,KLT切换快,内核自身也可用多线程技术实现,能提高系统的执行速度和效率
-
应用程序线程在用户态运行,而线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要用户态-内核态-用户态的模式切换,系统开销较大
(2)用户级线程
在纯ULT环境中,线程管理工作由应用程序做,在用户空间实现,内核不知道线程的存在。任何应用程序均需通过线程库进行程序设计,再与线程库连接后运行来实现多线程。线程库是一个ULT管理的例行程序包,实质上线程库是线程的运行支撑环境。
优点:
- 线程切换不需要内核特权方式
因为所有线程管理数据结构均在单个进程的用户空间中,管理线程切换的线程库也在用户地址空间中运行,因而进程不需要切换到内核方式来做线程管理 - 按应用特定需要允许进程选择调度算法:
线程库的线程调度算法与操作系统的低级调度算法是无关的 - ULT能运行在任何OS上,内核在支持ULT方面不需要做任何改变。线程库是可被所有应用共享的应用级实用程序,许多当代操作系统和语言均提供了线程库
缺点:
- 线程执行系统调用被阻塞时,不仅该线程被阻塞,且进程内的所有线程会被阻塞
- 纯ULT中,多线程应用不能利用多重处理的优点。内核在一段时间里,分配一个进程仅占用一个CPU,进程中仅有一个线程能执行
(3)混合式线程
- 在混合式系统中,内核支持KLT多线程的建立、调度和管理,同时也提供线程库,允许应用程序建立、调度和管理ULT。应用程序的多个ULT映射成一些KLT,程序员可按应用需要和机器配置调整KLT数目,以达到较好效果
- 在混合式系统中,一个应用中的多个线程能同时在多处理器上并行运行,且阻塞一个线程时并不需要封锁整个进程