1、第三章 进程管理引言:在所有采用微内核结构的操作系统中,都涉及到了“进程”的概念。 “进程”犹如操作系统的灵魂伴随操作系统始终,对进程进行控制、调度、完成进程间通信,以及解决进程死锁问题等就构成了进程管理的主要内容。进程还是操作系统中独立运行的基本单位,只有深刻理解了进程的概念,才能够更好地理解操作系统其他各部分的功能和工作流程。3.1 为什么要引入进程的概念3.1.1 从顺序程序设计谈起(1)什么是顺序程序在计算机上运行的程序是众多指令有序的集合,每一个程序只能完成预先规定的任务和操作。在早期的计算机系统中,只有单道程序执行的功能,也就是说,每次只允许一道程序独立运行。在这个程序的运行过程中
2、,将占用整个计算机系统资源,而且系统将按照程序步骤顺序执行,其他程序只能处于等待状态。因此,从宏观上看,各个程序是以线性状态排列并顺序执行的。(2)顺序程序的特征a. 顺序性CPU 单步顺序地执行程序,无论程序下一步操作是否需要等待上一步操作的结果都必须等待上一步操作结束后才能开始,无法实现并发执行。b. 封闭性资源独占:只有正在执行的程序本身所规定的动作才能改变当前资源状态。结果封闭:一旦程序开始运行后,其输出结果就不受外因的干扰。c. 可再现性程序不受外部条件的影响,只要系统资源充足,在给定相同初始条件的情况下,无论程序执行多少次,总能得到相同的执行结果。3.1.2 程序的并发执行和资源共
3、享计算机操作系统_第一章_操作系统概述第 2 页 共 38 页由于单道程序执行过程中浪费了很多系统资源,因此,人们设法在只有一个处理器的系统中让多个程序同时执行。这里应注意并发执行和多个程序在多个处理器环境下的并行执行。(1)程序并发执行的定义多道程序在计算机中交替执行,当一道程序不占用处理器时,另一道程序马上接管 CPU 处理权,大大提高了处理器的使用率。尽管在每一时刻或者说某一时刻 CPU 中仍然只有一道程序在执行,但是由于主存中同时存放了多道程序,在同一时间间隔内,这些程序可以交替的进行,从而提高 CPU 的使用率。(2)并发执行的软硬件支持软件方面:a. 要求有具备并发特征的源程序b.
4、 要有能够将源程序编译成可并发执行程序的编译器c. 要有支持并发执行的数据结构,如树形结构硬件方面:要有互不干扰的存储空间,能够提供每道程序使用的私有数据结构和空间,以解决多个程序争用存储空间和程序运行中的安全性问题。(3)举例内存中同时驻留有两个用户程序 J1 和 J2,并假定 J1 占用 CPU 的优先级比J2 高,它们在运行过程中需要用到设备 D1 和 D2。J1、J2、D1、D2 以及 CPU 的系统供求状况如下图所示:从图中可以看出,两个用户程序并非顺序执行的,而是出现了交叉执行的情况。从上图可以列出各程序使用系统资源时间段的表格,如下所示:从以上表格可以得出如下结论:a. 因为 J
5、1 占用 CPU 的优先级比 J2 高,所以 J1 使用 CPU 的时刻从 B 点开始,J2 使用 CPU 的时刻从 D 点开始。b. CPU 资源是比其他设备更重要的资源,因而出现了分段占用的情况。c. 各道程序在顺序执行的基础上形成了一种重叠的运行方式,虽然每道程序的执行时间不变,但执行的总时间缩短了。d. 产生了资源共享的特征,如 CPU 资源从原先的由某道程序独占变为多道计算机操作系统_第一章_操作系统概述第 3 页 共 38 页程序轮流使用。3.1.3 程序并发执行的特性(1)系统封闭性消失在单道程序环境中,由一个程序独占系统资源的局面打破了,资源状态由多个程序共同决定。尤其是当多个
6、程序或进程共享某个数据或变量时,就会因为程序执行的先后顺序不同而造成输出结果的不同。举例:设有观察者和报告者并行工作。在一条单向行驶的公路上经常有卡车通过。观察者不断观察并对通过的卡车计数。报告者定时地将观察者的计数值打印出来,然后将计数器重新清“0” 。有如下程序,其中 Cobegin 和 Coend 表示它们之间的程序可以并发执行。begin countinteger; count=0; cobegin observer begin L1;observe next car; count=count+1; go to L1 end reporter begin L2: print count
7、;count=0go to l2 end 计算机操作系统_第一章_操作系统概述第 4 页 共 38 页coendend 由于观察者和报告者各自独立地并行工作, count=count+1 的操作,既可以在报告者的 print count 和 count=0 操作之前,也可以在其后,还可以在 print count 和 count=0 之间。即可能出现以下三种执行序列:(1) count=count+1; print count; count=0;(2) print count; count=0; count=count+1;(3) print count; count=count+1, cou
8、nt=0。 以上例子说明,程序的并发执行导致顺序程序的封闭性和可再现性消失了。(2)程序和程序的执行分离程序顺序执行时,程序的计算步骤和流程与待加工的数据之间存在一一对应的关系。但在并发执行条件下,一个并发程序被多个作业调用,则针对不同的数据,会产生不同的输出结果。如有(x+y)*z 的操作,在程序编译时,给定 x,y,z 的值若不同,则必然将得到不同的结果。这就要求操作系统能识别数据输入和输出的对应关系,以免造成混淆。因此,需要硬件的支持,如采用大量寄存器来保存中间计算结果等,还要防止内存不同区域间的越界情况发生。(3)并发程序的相互独立与相互制约性a. 相互独立性:各个并发程序以独立的实体
9、单位请求系统资源b. 相互制约性 直接制约:一个程序 A 等待另一个程序 B 的计算结果作为输入,如果该结果无法到达,则程序 A 将一直等待,无法继续。 间接制约:两程序因争用某种资源而引起的制约形式,得到资源者可继续执行,得不到资源者则只能等待。3.1.4 进程概念的引入通过以上的分析,我们知道为了更好地体现资源共享的特点和提高程序的并发程度,原来“程序”这个静态概念已经不再适应多道程序设计环境下独立性、并发性和动态性等特征了。因此,20 世纪 60 年代,以 E.W.Dijkstra 为代计算机操作系统_第一章_操作系统概述第 5 页 共 38 页表的一批系统设计者提出了“进程(Proce
10、ss) ”的新概念来描述系统和用户的程序活动。引入进程是为了更好地描述系统中的并发活动,不同组织和个人对进程有很多不同角度的定义。以下是 1978 年全国操作系统会议上给出的一个比较全面的定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,使程序可以与其他程序并发执行。3.2 进程的表示和调度状态由进程的定义可知,进程是一个动态概念,动态概念需要通过一定的途径才能感知,需要通过一定的方法才能表现进程的存在。3.2.1 进程的表示1. 进程的组成a. 程序“程序”是进程运行时所对应的执行代码。一个进程可以对应一个完整的程序,也可以只对应一个程序的部分代码。由于进程只是程序针对某
11、些数据的一次执行活动,因此,多个进程也可以同时对应一个程序。这种特征通常称为某个程序被多个进程所共享,这种可共享的程序代码就称为“纯代码(Pure Code) ”或“ 再入码(Reentry Code) ”。这种纯码在进程执行时是不可修改的。b. 数据集合“数据集合”包括程序执行时所需的操作对象和场所。操作对象:指程序运行时的数据资源,通常作为程序的输入部分。场所:程序对操作对象进行处理的地点,通常包括:处理器、存储器、堆栈、缓冲区、I/O 通道、I/O 设备等。c. 进程控制块(Process Control Block)2. 进程控制块a. 定义进程控制块是一种数据结构,其中包含了进程的描
12、述信息和控制信息。b. 进程控制块的功能及特点计算机操作系统_第一章_操作系统概述第 6 页 共 38 页 进程控制块保存了进程各个时刻的状态,是控制进程转换的标志; 每一个进程都有一个进程控制块,不同操作系统下的进程控制块的内容和信息量有所不同; 进程控制块是进程存在的唯一标志,进程创建时,就创建一个 PCB;进程撤销时,PCB 就被系统回收;c. PCB 的组成部分 进程标识名(数):系统中用以唯一标识一个进程的符号,标识名是由若干字母和数字组成的符号串,标识数是由数值组成的编号。一般由系统加以分配。 进程位置信息:用以描述进程的程序和数据部分在主存或外存中的物理位置。 进程状态:描述进程
13、当前所属的状态,以此作为进程调度的判断依据。 进程优先级:系统根据进程的轻重缓急或先来后到为进程分配一个以优先数表示的优先级,优先级高的进程通常先得到 CPU 的使用权。 进程现场保护区:进程在执行中可能因缺乏某种资源等原因从 CPU 中撤下,为使进程能在条件满足时重新调度,需要将 CPU 现场保存到主存或进程工作区中。此时,则由 PCB 给定现场保护区的主存始址。 资源列表:该部分给出进程除 CPU、主存之外,还需要的如 I/O 设备、外存、数据区等其他资源。 队列指针或链接字:一般各进程按照其属性或状态将排成若干队列,为使进程能够形成这样的队列,需要有指针指向下一个进程,或由链接字说明下一
14、个进程。3.2.2 进程的调度状态1. 进程的基本调度状态由于进程是一个动态概念,这种动态特征就体现在其状态会由一个状态跳转到另一个状态。通常将这种状态的跳转称为“调度” 。系统中的不同事件都可以引起进程状态的调度。一般一个进程至少具有以下三种状态:(1)就绪状态(Ready State)就绪状态指的是进程已获得了除 CPU 以外的全部资源,只要等待调度程序计算机操作系统_第一章_操作系统概述第 7 页 共 38 页调度它。通常系统中会有多个处于就绪状态的进程,它们按照先来后到或优先级的次序排队形成就绪队列(Ready Queue) 。(2)运行状态(Run State)运行状态指的是进程获得
15、了包括 CPU 在内的所有资源,CPU 正在执行该进程程序的状态。由于在单 CPU 系统中,某一时刻只有一个进程处于运行状态,因此系统内是没有运行队列的。(3)阻塞状态(Block State)阻塞状态指的是正在运行(开始之后,结束之前)的进程,因为某种原因暂时不能继续运行,而必须从 CPU 中撤下的状态。2. 各状态的状态转换图如下所示。3.3 进程的控制3.3.1 进程的控制机构进程从创建到消亡的过程是其状态不断变化的过程,如何控制和引起这些变化,是进程控制要解决的问题。进程作为一个动态实体,其生命过程是从它被系统所创建时开始的,进程的控制过程要与进程的三种基本状态结合起来。完成进程控制的
16、机构属于操作系统的内核部分(Kernel) ,内核是计算机系统硬件的首次扩展,它通过“原语”控制来改变进程的状态。1. 原语的定义原语是指由若干条机器指令构成的并用以完成特定功能的一段程序。2. 原语的特点(1)原子操作性原语最显著的特点就是具有“原子操作性(Atomic Operation) ”。原子操作是一个不可分割的操作,即一个操作中的所有动作,要么全做,要么全不做。在单处理机环境中,这种原子操作性可以通过屏蔽终端来实现。(2)用户透明性操作系统原语对用户是透明的,一般不允许用户直接使用,避免对操作系统内核的干扰和破坏。但随着系统的发展,为系统程序员的方便,有的原语被计算机操作系统_第一
17、章_操作系统概述第 8 页 共 38 页作为一种特殊的系统调用,既提供给系统进程,也提供给其他进程,通过系统调用方式使用。3. 进程控制原语的主要作用在进程控制中,自始至终要涉及到进程的数据结构-PCB,控制原语要对PCB 的表项进行填写、修改、更新、保存和清除等操作。3.3.2 进程控制原语1. 进程的创建(1)进程创建的两种方式 系统初启时就建立一些系统进程,这些进程是需要常驻内存的; 由系统进程创建其他非常驻内存的系统进程和用户进程;(2)进程创建的模式(树型结构)一个进程可以创建若干个新进程,新创建的进程又可以继续创建进程,这个创建过程形成了一种树形结构。在操作系统中称为“进程图(Pr
18、ocess Graph) ”。一个完成某一规定功能的进程,能够创建若干个子进程,并将功能细化后分给各个子进程完成,子进程又可根据任务的繁重程度和可分程度继续创建它们的子进程,这样就形成了进程的家族系统。通常创建子进程的进程称为“父进程” ,被创建的进程称为“子进程” ,但该名称是相对的,即“子进程”若创建了其自身的“子进程” ,它又具有父进程的身份。(3)树型结构的优点 资源分配严格在树型结构中,所有的资源都必须包含在其祖先进程的资源许可范围内,每个子进程只能使用其父进程所拥有的资源。这样的资源分配形式就保证了资源利用的合法性和继承性。 进程控制灵活,层次清晰、关系明确树型结构的典型特征就是层
19、次分明,不同层次的进程具有的优先级和控制权限可以单独设置,易于管理。同时,各子进程分担总任务中的一部分,子进程间是可以并发执行的,这在很大程度上提高了进程执行的效率,也易于做到计算机操作系统_第一章_操作系统概述第 9 页 共 38 页权责分明。2. 状态转换原语由前述可知,进程作为一个活动的对象,其存在和活跃的重要标志就是进程会在多个状态间转换,而控制进程状态转换的就是状态转换原语。(1)挂起原语进程在 CPU 中运行过程中,因为缺乏资源、等待 I/O 操作等事件的发生时,通过挂起原语将它从 CPU 中撤下,排入等待队列,同时调入新的进程进入CPU。其具体操作方法是:用将被挂起的进程的外部标
20、识名为索引名,在 PCB 集合中查找到该进程的PCB,返回该进程的内部标识数,检查该进程的状态若为“运行”状态,则中断其运行,将 CPU 状态保存在 PCB 的寄存区内,以便下次调度时能恢复 CPU 现场。应当注意的是,进程的挂起是进程的主动行为,即挂起原语只能挂起自己或挂起由自己创建的子孙进程,而不能挂起其他进程或有其他进程创建的子进程。(2)激活原语任何一个进程所处的某个状态均有“静止”和“活跃”两种状态,如“就绪”状态而言,就分为“静止就绪”和“活跃就绪”两种,这种不同是在对进程状态划分过程中的细化,以更好地体现进程状态的细微差别。只有处于“活跃”状态的进程才能参与排队、等待 CPU 的
21、调度等,因此,激活原语就是将进程从静止状态变为活跃状态的原语。(3)阻塞原语和唤醒原语阻塞和唤醒原语与挂起和激活原语类似,阻塞动作一般由进程自身发出,即进程在 CPU 中执行过程中发现等待的某一事件尚未出现时将自身阻塞起来。而唤醒原语一般是由其他进程发出的,发出唤醒原语的进程可以和被阻塞进程没有任何关系,但由于发出唤醒原语的进程恰好完成了某一事件,得到了一个结果。这一结果也许正是某个被阻塞进程所需要的,这样就起到了进程间相互协作的目的。计算机操作系统_第一章_操作系统概述第 10 页 共 38 页3. 进程的撤销进程任务执行完毕时,应及时撤销该进程,进程撤销的主要任务在于释放资源,回收 PCB
22、 表空间。具体步骤如下:由父进程或祖先进程发出撤销原语-依内部进程数检索 PCB 表集合-改变进程为自由态-撤销 PCB 表项-归还其占用的资源-判断是否需要重新调度3.4 进程调度3.4.1 交通控制程序和进程调度程序1.交通控制程序在操作系统中引入进程概念后,使得系统的复杂程度大大增加,其管理和运作的难度也不断加大。随之而来的系统中各个进程的运行机制、状态变化,以及大量的进程如何保证协调一致等问题曾一度困扰系统开发和研制人员。以 J.H.Saltzer 为代表的一批计算机系统专家考虑将现实生活中的道路交通管理的思想引入对操作系统和进程的管理中来,取得了成效。这一思想的主要思路是:计算机系统
23、中为数众多的进程就相当于行驶于道路上的各种车辆,车辆的不同功能类似于进程所属的不同类别;车辆的体积大小类似于进程的规模大小;车辆的速度快慢类似于进程的执行速度等。操作系统相当于道路管理中的指挥中心,由它负责保证各进程协调一致,互不冲突。车辆间难免发生的拥堵、车祸等事故类似于进程间的死锁现象;道路中设置的红绿灯类似与操作系统中的各种进程自动控制机构;道路拓宽后,可以同时开行多路车辆类似于进程树型结构中的并发执行;由操作系统发出的控制原语类似与交通指挥中的信号等等。由上所述可知,当把交通控制的概念引入操作系统时,其主要智能在于管理进程状态之间的转换和协调进程间的通信,做好进程状态转换钱的准备工作和
24、转变之后的恢复工作,并最终将整个控制工作细化分交由原语等指令来具体完成。2.进程调度程序的功能要完成进程调度,系统要随时了解每一个进程的情况,它们的状态、获得计算机操作系统_第一章_操作系统概述第 11 页 共 38 页资源的情况等,这些都要记录在进程控制块 PCB 中,具体地进程调度程序的功能有: 记录系统中所有进程的有关情况及状态特征,并查询、登记和更新进程控制块 PCB 的相应表项,并根据表项中的内容和状态做出选择决定。 根据系统选定的调度算法,从就绪进程队列中选取一个活动就绪的进程,分配 CPU 给它,并决定它运行多长时间(如采用时间片轮转算法)3.4.2 进程调度算法的设计进程调度是
25、操作系统的核心,它是所有进程运行和状态转换的控制机构,作为物理器件的 CPU 的处理能力正是由进程调度加以体现的。因此,设计一个良好的进程调度算法至关重要。在设计进程调度算法时需要考虑以下四个问题:1.引起进程调度的时机进程在未发生调度的时候,总是保持原有状态,完成既定的工作任务。一旦有程序自身或外部环境发生变化导致进程必须发生调度时,进程的调度动作才发生。系统中能引起进程调度的原因很多,其条件和时机因具体操作系统类型和内核而不同,一般有以下一些因素: 缺乏资源正在运行的进程因为某个(些)资源不能满足,不得不从运行状态转入阻塞状态。此时,一个运行进程被撤下,引起调度使另一个进程进入 CPU 运
26、行。 进程结束进程获得所有软硬件资源正常执行完毕,退出 CPU 并终止其生命周期,此时再调度另一新的进程进入 CPU 运行。 外部中断 进程执行过程中遇到外部中断信号,如打印机打印完毕时,通过打印通道或信号线路传送一个激励信号,将原阻塞进程唤醒重新进入 CPU 运行,或引起调度使另一进程运行。 时间片到如果系统是分时系统或者以时间片作为激励调度的系统,时间片是引起进程调度的主要因素。每当所分配的时间片用完时,正在运行的进程就暂时停止计算机操作系统_第一章_操作系统概述第 12 页 共 38 页工作,并排入就绪队列,引起调度使另一活动就绪的进程进入运行。2.进程调度方式通常依据进程在执行过程中
27、CPU 资源能否被其他进程抢占,而将进程调度方式分为两种,即剥夺方式和非剥夺方式(非抢占方式)(1)剥夺方式通常也称为抢占式调度,其含义是:当一个进程运行时,系统可基于某种原则强行将其从 CPU 中撤下,把 CPU 分配给其他进程。剥夺原则多采用优先级、重要进程和紧急进程等概念,多用于实时、分时和需要及时响应的系统中。剥夺原则包括: 优先级原则优先级高的进程可以剥夺优先级低的进程的使用权而运行起来。 短进程优先原则端进程可剥夺长进程的 CPU 使用权而占用 CPU 机时,此处的“长短“指的是进程占用 CPU 时间的长短。 时间片原则每个进程占用相同的时间片长度,时间片用完后重新引起调度。 强制
28、性剥夺原则极其重要的进程或者人工干预,强制引起调度,如人为地强制结束某个进程的执行操作。 剥夺方式的优缺点: 优点:方式灵活,可保证重要的实时信息得以及时处理。 缺点:系统开销大,体现在因为要实时判断进程的优先级,要比较各进程占用 CPU 时间的长短,要划分和轮转时间片等都需要系统开销。同时,被从CPU 中撤下的进程的 CPU 现场保护也需要时间和空间开销。(2)不可剥夺方式通常也称为非抢占式调度。当一个进程获得 CPU 后,除非因为某种原因自行阻塞或正常运行完毕,是不能从该进程处夺走 CPU 使用权的。3.进程队列的组织计算机操作系统_第一章_操作系统概述第 13 页 共 38 页进程依据其
29、不同状态和属性排列成队列,等待进程调度程序的调度。由于进程与 PCB 是一一对应的,因此,对进程的队列组织,实质上是对其 PCB 的组织。PCB 的组织通常有如下三种方式:(1)线性表方式对进程的状态不做区分,将所有进程的 PCB 都存放在一个表格中,查找时采用顺序查找的方法进行。如下图所示。该方法在建立和管理上比较简单,但当表中 PCB 数量较多时,顺序查找的时间开销很大,一般很少使用这种方法。(2)改进的线性表方式改进的线性表中存放的 PCB 仍然是不规则的,但通过增加若干个专门表,表中的指针指向线性表的对应表项,最后再使用一个起始地址指向专门表作为入口地址。如下图所示。(3)链接表方式以
30、上改进的线性表虽然在一定程度上提高了查找速度,但因为又引入了其他表格,造成了空间上的浪费。链接表方式采用的是将具有相同状态的所有PCB 组成专门的队列,有针对性地排列,形成独立的运行队列、就绪队列和阻塞队列等。结构上只要在每个 PCB 中增加一个指向下一 PCB 的指向指针即可。另外,还可以把暂不使用的 PCB 块链接起来,形成空闲 PCB 队列。如下图所示。3.4.3 常用的进程调度算法进程的调度算法是一种服务于系统目标的策略,对于不同的系统和系统目标,应采用不同的调度算法。算法选择的合理性将决定进程调度质量的优劣,主要要解决两个问题: 在就绪队列中,应选择哪一个进程的问题; 选中某进程后,
31、如何为它分配处理器,该进程能占用处理器多长时间;以下分析几个常用的进程调度算法。(1)静态优先级法静态优先级法的出发点是:保证进程的优先数从进程创建到撤销的整个生命周期内保持不变。这种不变性带来的优点是管理简单,无需考虑其优先数的计算机操作系统_第一章_操作系统概述第 14 页 共 38 页变化;缺点是方式不灵活,没有综合考虑进程在生命周期内会因状态变化而带来的优先数的改变的需求。确定静态优先级的原则有以下四个: 依进程类型确定系统内的进程有很多不同种类,但从其性质来分,主要有系统进程和用户进程两类。系统进程是运行于管态(核心态)下的进程,具有比普通用户进程高的优先级。又如,在批处理和分时系统
32、中,前台实时处理的作业的进程优先级比后台作业的进程高。因此,依据进程类型不同来区分优先级是首要考虑的因素。 依作业的资源要求确定资源主要包括处理机机时、存储器、I/O 设备等。那些对上述资源需求量小,需求紧张程度低的作业进程,其优先级通常比较高。 依作业到达的时间确定作业到达时间指的是作业描述完毕进入队列的时间。按照到达时间的先后顺序确定优先级,先到达的作业的优先级比较高。如常用的 FCFS 算法(先来先服务) 。 依用户具体需求确定用户可以根据其经济承受能力和当前作业的紧急程度,用经济利益换取高优先级。(2)动态优先级法 静态优先级法的缺点:无法反映系统以及进程在运行过程中发生的各种变化,不
33、能充分体现系统的动态特征。 定义:进程的优先数可以随进程状态和程序段的不同而改变,且可多次改变。 原则a依进程占用 CPU 时间长短(占用时间长,级别低;占用时间段,级别高) ;b依进程在就绪队列中等待的时间长短(等待时间越长,优先级越高) ; 优缺点计算机操作系统_第一章_操作系统概述第 15 页 共 38 页a优点:可保证多个进程调度的灵活性,保证短进程、紧急和重要进程可优先执行。b某些优先级较低的进程将迟迟得不到执行,甚至长期等待,造成“饿死”现象。(3)时间片轮转法静态和动态优先级法主要针对进程本身优先级的问题,没有把 CPU 的因素考虑进去。而时间片轮转算法的宗旨在于不管什么类型的进
34、程,其优先级如何,都让它们有执行的机会。 执行方式时间片轮转算法通常应用于分时系统中,其执行方式如下:通过规定一个称为“时间片”的固定执行时间,就绪队列中的进程按照FIFO 的方式排列。调度程序每次从队列头取出一个进程投入运行,但其运行时间不能超过事先预定好的时间片长度。一旦分配给该进程的时间片用完,该进程就必须释放 CPU 资源,回到就绪队列尾部,等待重新调度。 时间片轮转法的技术关键时间片轮转算法中的关键和技术难点在于时间片大小的确定。考虑到系统效率和系统响应时间的影响,对时间片的划分应当适中:若时间片太大,则失去了划分的必要;若时间片太小,则系统忙于在各个进程之间切换,做进程 CPU 现
35、场的保护和新进程的重新调度,缺没有时间真正用于程序的执行。(4)可变时间片轮转法以上讨论的是固定时间片轮转法,其时间片长度是固定的。这种固定时间片的方法会随着就绪队列中进程数量的急剧变化而变得不合理,如进程数量多时,时间片显小;进程数量少时,时间片显大。因此,可变时间片轮转法采取时间片大小可变的措施加以改进。 每次时间片轮转周期开始时,都重新计算一次就绪队列中进程的数量,这种计算只需要统计 PCB 的数量即可,不会花费大量时间。假定系统响应时间为 T,若就绪队列中有 N 各进程,则每个进程能分到的时间片长度为 t=T/N。这样随着 N 值的改变,时间片长短就随之变化了。这种计算机操作系统_第一
36、章_操作系统概述第 16 页 共 38 页方法称为“固定周期轮转法” 多队列轮转法多队列轮转法基于这样一种考虑:因为进程的所属的类别不同,其占用资源的情况也各异,则各进程完成相应操作的时间就存在差异。假设规定时间片长度为 0.2s,那么对于只需 0.02s 就可完成的进程,该时间片就是一个浪费,而一个需要 2s 才能完成的进程却需要在就绪队列中连续排队 10 次,做十次轮转才能执行完毕。因此,需要对这种单一就绪队列的情形加以改进,引入多个就绪队列,每个就绪队列的时间片各不相同。如果在一个短时间片队列中轮转一次尚未运行结束的进程,就自动排入下一个时间片相对较长的就绪队列中去。例:有三个时间片长度
37、分别为 0.02s、0.2s、2s 的就绪队列,系统首先完成时间片为 0.02s 的队列中的所有进程的调度,再调度 0.2s 和 2s 队列的进程。这种多队列轮转的方式既保证了短作业优先,又满足了长进程能占用更长时间的时间片,是对固定周期轮转法的精妙改进。3.4.4 作业、进程和程序之间的区别与联系1.用户作业、进程和程序之间的联系以下通过一张图表,来了解上述三者之间的组成关系。2.进程和程序的区别3.5 进程通讯(进程通信)1.进程通讯的定义多道程序设计环境中必然存在进程的并发执行。并发执行的进程为了协调一致地完成指定任务,它们之间必定具有一定的联系。这种联系通常采用进程间的数据或信息交换的
38、方式进程,这种方式就称为“进程通讯” 。进程的通讯过程实质上反映了进程间相互依赖和制约的关系。进程间通讯主要体现在同步和互斥两个方面。2.临界资源进程间的相互制约关系包括直接制约和间接制约,直接制约是进程间互相等待交换信息的制约形式;间接制约是进程间争夺某一资源的制约方式。通常计算机操作系统_第一章_操作系统概述第 17 页 共 38 页将间接制约方式中进程间争夺的资源称为“临界资源” 。 含义:可共享的资源,但某一时刻仅允许一个进程使用,从资源属性角度看,它属于独占资源。 范围:硬件设备(如打印机、绘图仪、读卡器等) 、变量、数据、表格文件等。3.临界资源的成分划分为了保证临界资源的正确使用
39、,通常把对临界资源的访问过程分成四个部分: 进入区:在进入区中,检查进程进入临界区的资格,即进程是否可参与临界资源的争用。 临界区:进程汇总的程序部分访问临界资源的程序代码部分,也即使用临界资源。 退出区:将正在访问临界区的进程临界区本身标志清除,退出临界区,释放临界资源。 剩余区:进程程序代码中的其他部分。3.5.1 进程间的同步和互斥1.进程间的同步一般情况下,各个进程按照自己的执行顺序和进度执行,故而以互不干扰、不可预知的速度向前推进。但有时为了达到某种合作效果,一个进程必须停下来等待另一个进程的运行结果。这一暂停的关键位置称为“关键点” 。 定义多个相互合作的进程,在某些关键点上可能需
40、要相互等待或互相交换信息的工作模式。 应用举例a现实生活中,公交车司机和售票员间的同步关系,如下图所示。b如下形式的用户作业程序:Z=func1(x)*func2(y)的同步关系,如下图所示。2.进程间的互斥(1) 定义计算机操作系统_第一章_操作系统概述第 18 页 共 38 页当一个进程进入临界区使用资源,另一个进程处于等待状态,必须等待占用临界资源的进程退出临界区后,另一个进程才能访问该临界资源。这种进程之间的相互制约关系就称为进程的互斥。(2) 互斥原则a空闲让进:当没有进程处于临界区时,可以也必须允许一个请求进入临界区的进程立即进入自己的临界区。b忙则等待:当已有进程进入临界区时,其
41、他试图进入临界区的进程必须等待。c有限等待:对要求访问临界资源的进程,应保证其在有效时间内进入自己的临界区。d让权等待:当进程无法进入自己的临界区时,应及时释放处理器资源。(3) 互斥操作的必要性如果操作系统没有对临界资源良好的互斥操作机制,将带来许多问题,如下例所示。例:设有两个进程 P1、P2,它们共享一个变量 count,具体操作为:P1: R1=count; P2: R2=count; R1=R1+1; R2=R2+1;count=R1; count=R2; 若上述两个进程并发执行,则 count=2,为正确的结果; 若上述两个进程未将 count 变量作为临界资源互斥使用,则其执行顺
42、序也可能是:P1: R1=count;P2: R2=count;P1: R1=R1+1; count=R1;P2: R2=R2+1; count=R2; 这样 count 的值为 1,不是想要的结果。3.实现临界区互斥的锁操作法操作系统中实现互斥和同步的机制统称为“同步机制” 。通常采用某个标志位来实现,并通过一个系统程序来控制这些同步机制,这种程序称为“同步原计算机操作系统_第一章_操作系统概述第 19 页 共 38 页语” 。同步机制的实施有多种方式,比较简单的同步机制有标志位法、加锁开锁法等。(1)锁操作法加锁开锁法也称为测试法(Test and Set) ,对锁状态检测完后,重新设置锁
43、的状态。具体操作方法如下:该方法采用一个变量 S 作为“锁” ,代表某个临界资源的状态。S=0(False)表示该资源未占用,S=1(True)表示该资源正被使用。要进入临界区的进程首先执行加锁原语,当其退出临界区时,执行开锁原语,从而实现对临界区的互斥使用。两个原语如下所示:加锁原语 Lock(S): 测试 S 是否为 0;若 S=0,表示临界区未占用,进入临界区,置S=1;若 S=1,表示临界区被占用,继续测试;开锁原语 Unlock(S): 测试 S 是否为 1;若 S=1,表示临界区处于占用状态,则置 S=0;(2)改进的锁操作法从上述方法可见,等待进入临界区的进程需不断循环测试 S,
44、等待 S 变为0,浪费了 CPU 机时。通常的改进方法是:将等待进程排队,而不再循环测试 S值。当一个进程执行完毕退出临界区时,就从等待队列中选取一个分配临界区即可。3.5.2 信号量和 P、V 操作1.概述信号量(Semaphore)同步机制,是由荷兰著名的计算机科学家E.M.Dijkstra 于 1965 年提出的。问世以来称为一种卓有成效的进程同步机制,广泛应用于单处理机系统、多处理机系统以及计算机网络中。它借鉴了城市道路交通管理中的信号灯原理,来控制众多进程的执行和阻塞状态。在长期应用中,信号量机制得到了很大的发展,不仅在进程同步中使用,计算机操作系统_第一章_操作系统概述第 20 页
45、 共 38 页而且广泛应用在所有临界资源和临界区控制的场合,并逐渐发展成为多个信号量的信号量集(Semaphore Set)机制。2.信号量及 P、V 操作Dijkstra 把“同步和互斥”的关键含义抽象成“信号量”概念,并引入在信号量上的 P、V 操作作为同步原语。P 和 V 分别是荷兰文中“等待”和“发信号”两词的首字母。(1)信号量含义在操作系统中,信号量是用来表示资源的实体,不同的资源用不同的信号量表示,它是一个整型变量,其值能且仅能由 P、V 操作改变。操作系统正是利用信号量这一物理量来模拟进程对临界资源的占用和释放。(2)信号量特点a用单词 Semaphore 的第一个字母 S 作
46、为信号量标志。信号量是一个被保护的量,因为它表示的是实体,实体个数必须大于等于零,故信号量 S 的初值非负。b只有 P、V 操作(写法为 P(S) 、V(S) )和信号量初始化操作才能访问和改变信号量 S 的值。c一个信号量往往对应于一个资源或一个等待该资源的队列,该队列中的进程处于阻塞状态。(3)信号量分类(按信号量用途分)a公用信号量(二元信号量)公用信号量初值为 1,并且只有“0”和“1”两种取值,主要用于进程间的互斥操作。b私有信号量(一般信号量)私有信号量允许取值为任意非负整数,主要用于解决进程间的一般性同步问题。(4)P、V 操作P、V 操作是对信号量进行的原语操作,Dijkstr
47、a 对这两个原语的操作定义如下:aP(S)操作计算机操作系统_第一章_操作系统概述第 21 页 共 38 页当信号量 S 大于零时,将 S 值减 1。如果 S0,说明此次资源释放并不影响 P(S)操作,调用 V(S)操作的进程继续执行 若 S0,此时虽然 S0,但因为 V(S)操作释放了一个有效资源,故有一个处于阻塞状态的进程可被唤醒。相应的,信号量 S的绝对值|S|0,表示等待该资源的进程数为 S 个。对以上的 P、V 操作可以用 C 语言描述如下,其中还包含了等待(Wait)和唤醒(Wakeup)两个原语:P(int s) V(int s) s=s-1; s=s+1;if (s0,表示bu
48、f 中有数可取,唤醒 Pb 进程取数P(Sb); / P(Sb)操作,即 Sb=Sb-1,则Sb0),表示 buf 非空,此时不能送数,相当于阻塞了送数进程if (count=0)kill(Pa) / 计数器到零,撤销 Pa 进程Pb / 取数进程 P(Sa) / P(Sa),即 Sa=Sa-1,则 Sa0,则 buf 不为空,只能取数而不能送数(从缓冲区中取数)V(Sb); / V(Sb)操作,Sb=Sb+1,唤醒 Pa 进程送数(其他操作)if (count=0)kill(Pb) / 计数器到零,撤销 Pb 进程4.生产者-消费者问题(Producer-Consumer Problems)
49、计算机操作系统_第一章_操作系统概述第 25 页 共 38 页生产者-消费者问题及其同步技术是由 Dijkstra 于 1968 年提出的。在计算机系统中的许多问题都可以归结为生产者-消费者问题。(1)问题描述一个进程如果使用资源,可以把它称为消费者;一个进程如果是制造并释放上述资源的,则可把它称为生产者。但生产者和消费者的地位并不是固定的,生产者可以称为消费者,消费者也会变为生产者。上述二者的同步关系问题就称为“生产者和消费者问题” 。(2)问题解决在此类问题的解决上,信号量可以作为资源计数器和同步进程的工具。以下说明以缓冲存储器为媒介的两进程的通信问题。一个生产者进程生产消息,然后把它放在缓冲存储区中;一个消费者进程从缓冲存储区中取走消息并及时处理它。假设该缓冲区是由 N