1、第四章 多线程(thread)线程是近年来操作系统领域出现的一个非常重要的机制和技术,其重要程度不亚于进程。线程机制可以提高程序执行的效率,而且也方便用户编程,不但适用于多机系统,对大多数单CPU的个人计算机也同样带来好处,因此当代操作系统都支持线程。1、线程的引入进程的两个基本属性:n资源分配的基本单位:给每个进程分配一虚拟地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态、优先级、调度n调度基本单位:进程是一个执行轨迹。以上两个属性构成进程并发执行的基础。对进程系统必须完成的操作:n 创建进程n 撤消进程n 进程切换缺点:时间空间开销大,限制并发度的提高引入线程的目的n进程的
2、局限性n在操作系统中,进程的引入提高了计算机资源的利用效率。但在进一步提高进程的并发性时,人们发现进程切换开销占的比重越来越大;n传统的进程不能很好的利用多处理器,因为一个进程在某个时刻只能使用一个处理器;n进程间通信的效率受到限制;n引入线程的目的:n减小(进程/线程)上下文切换开销;n更好支持多处理器(MP),达到最大程度的并行;n简化进程间的通信;2、线程的概念n定义:线程是进程内一个相对独立的、可调度的执行单元。有时称轻量级进程。n将原来进程的两个属性分开处理。n每个线程都具有n执行状态;n受保护的线程上下文,当线程不运行时,用于存储现场信息n独立的程序指令计数器n执行堆栈n容纳局部变
3、量的静态存储器n可存取所在进程的内存和其他资源线程的特性n 并行性:同一进程的多个线程可在一个或多个处理器上并发或并行运行n 共享性:同一个进程中的所有线程共享进程获得的主存空间和一切资源n 动态性:线程也是程序在相应数据集上的一次执行,由创建而产生,至撤销而消亡,有其生命周期线程的性质n线程是进程内一个相对独立的可执行单元n线程是操作系统中的基本的调度单元n进程中至少要有一个或一个以上的线程n线程可以创建其他线程n线程并不拥有资源,只是使用他们,进程是资源分配和拥有的基本单元。n由于共享资源,线程间需要通信和同步机制n线程有生命期,有诞生和死亡线程的好处n创建一个新线程花费时间少(结束亦如此
4、)n同一进程中两个线程的切换花费时间少,如果机器设有“存储恢复所有寄存器”指令,则整个切换过程用几条指令即可完成)n由于同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核n适合多处理机系统线程的应用n前台和后台工作n异步处理工作n加快执行速度n组织复杂工作n多用户服务线程的状态由于线程是调度和执行的基本单位,在它的生命过程中有状态的变化:就绪状态线程已具备执行的条件,等待调度程序分配给一个CPU运行 运行状态线程正在CPU上运行 等待状态线程正等待某事件发生进程与线程的比较n调度:进程中可能有多个线程,一个线程阻塞并不影响整个进程,进程中的其他线程仍然可以参与调度运行n并发性:进
5、程间可并发,同一进程中的线程间亦可并发n拥有资源:进程拥有资源,进程中有挂起操作,线程不拥有资源,没有权力决定进程或自己从主存撤出,挂起只是进程一级的概念n系统开销:线程上下文切换比进程上下文切换要快得多,同一进程中的线程切换系统开销小。n地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享某进程内的线程在其他进程不可见。n通信:进程间通信通过IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信需要进程同步和互斥手段的辅助,以保证数据的一致性线程控制原语n创建线程原语n撤消线程原语n阻塞或等待原语n挂起一个线程n恢复一个线程n改变优先数线程组(thread grou
6、p)n每个线程属于某个线程组n每个线程创建时,用户可以显示的说明为它创建一个新的线程组;也可以由系统自动把该线程归入创建该线程的线程所在的线程组n线程组是多个线程的集合,系统将它们归入一个单独的对象,统一加以管理n可为线程组设置不同的特性和保密安全方法n一个线程在已被创建后,不能更改移入其他线程组单线程进程单线程进程单线程进程(模型模型)用户地用户地址空间址空间进程进程控制块控制块用户用户堆栈堆栈内核内核堆栈堆栈进进程程进程控制块进程控制块用户地址空间用户地址空间用户栈用户栈内核栈内核栈管理者管理者执行序列执行序列多线程进程多线程进程多线程进程(模型模型)用户用户地址空间地址空间进程进程控制块
7、控制块线程控制块线程控制块系统系统堆栈堆栈用户用户堆栈堆栈线程线程1 1线程控制块线程控制块系统系统堆栈堆栈用户用户堆栈堆栈线程线程N N基于线程的操作系统分类n单进程和单线程系统n单进程和多线程系统n多进程和单线程系统n多进程和多线程系统one processone threadmultiple processesone thread per processone processmultiple threadsmultiple processesmultiple threads per process3、线程的实现n用户级线程n内核级线程n混合式线程用户级线程(ULT)User-Level
8、Thread)由用户应用程序建立、调度和管理的线程。不依赖于OS内核,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。如:数据库系统informix,图形处理Aldus PageMaker。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。一个线程发起系统调用而阻塞,则整个进程在等待。时间片分配给进程,多线程则每个线程就慢。线程库:基于多线程的应用程序的开发和运行环境。n创建、撤消线程n在线程之间传递消息和数据n调度线程执行n保护和恢复线程上下文用户级线程的活动n内核不知道线程的活动,但仍然管理线程所属进程的活动n当线程调用
9、系统调用时,整个进程阻塞n但对线程库来说,线程仍然是运行状态 即线程状态是与进程状态独立的用户级线程的优点n线程切换不调用内核n调度是应用程序特定的:可以选择最好的算法nULT可运行在任何操作系统上(只需要线程库)用户级线程的缺点n大多数系统调用是阻塞的,因此核心阻塞进程,故进程中所有线程将被阻塞n核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上内核级线程(KLT)Kernel-Level Threadn由操作系统的内核建立、调度和管理的线程。n所有线程管理由内核完成n没有线程库,但对内核线程工具提供APIn内核维护进程和线程的上下文n线程之间的切换需要内核支持n以线程
10、为基础进行调度n例子:Windows NT,OS/2内核级线程的优点及缺点优点:n对多处理器,内核可以同时调度同一进程的多个线程n阻塞是在线程一级完成n内核例程是多线程的缺点:n在同一进程内的线程切换调用内核,导致速度下降用户级和内核级线程比较n调度和切换速度ULT切换快,KLT切换与进程切换相似。ULT通常发生在一个应用进程的诸线程中,无需通过中断进入内核。n系统调用ULT进行系统调用时,会引起进程的阻塞;KLT进行系统调用时只会引起该线程阻塞。n线程执行时间ULT以进程为单位调度,KLT以线程为单位调度。ULT:进程A有1个线程,进程B有100个线程,则A的线程比B快KLT:进程A有1个线
11、程,进程B有100个线程,则B比A快n使用范围:ULT广,任何OS,KLT需OS内核支持n调度算法ULT与OS调度算法无关,可针对应用优化n多处理器支持KLT可充分利用多处理器ULT和KLT结合方法n 线程创建在用户空间完成n 大量线程调度和同步在用户空间完成n 程序员可以调整KLT的数量n 可以取两者中最好的n 例子:Solaris用户级和内核级线程P PP P用用户户空空间间线程库线程库内内核核空空间间2 2)用户级线程)用户级线程用用户户空空间间P P内内核核空空间间1 1)内核级线程)内核级线程用用户户空空间间线程库线程库P P内内核核空空间间3 3)混合式线程)混合式线程ULTULT
12、KLTKLTProcessProcessP P根据线程运行的地址空间n用户线程:运行在用户地址空间的线程。n内核线程:运行在内核空间的线程。n所有用户级线程都是用户线程;n内核级线程可以是用户线程,也可以是内核线程。NT线程的有关APInCreateThread()函数在调用进程的地址空间上创建一个线程,以执行指定的函数;返回值为所创建线程的句柄。nExitThread()函数用于结束本线程。nSuspendThread()函数用于挂起指定的线程。nResumeThread()函数递减指定线程的挂起计数,挂起计数为0时,线程恢复执行。小结n掌握n线程引入的目的:线程和进程的比较n线程的定义、特性和性质n线程的实现方式:n用户级线程n内核级线程n混合线程n一些基本概念:n线程库n用户线程、内核线程