全部科目 > 软件设计师 >
2022年下半年 上午试卷 综合知识
第 24 题
知识点 同步与互斥   进程   进程的同步与互斥   信号   信号量  
关键词 PV   进程   信号量   信号  
章/节 计算机软件知识  
 
 
进程P1、P2、P3、P4、P5和P6的前趋图如下所示。假设用PV操作来控制这6个进程同步与互斥的程序如下,程序中的空①和空②处应分别为(24),空③和空④处应分别为(25),空⑤和空⑥处应分别为(26)。

Begin
S1,S2,S3,S4,S5,S6,S7,S8:semaphore,//定义信号
S1:=0;S2:=0;S3:=0;S4:=0;S5=0;S6=0;S7=0;S8=0

 
  A.  V(S1)V(S2)和P(S2)P(S3)
 
  B.  V(S1)P(S2)和V(S3)P(S4)
 
  C.  V(S1)V(S2)和V(S3)V(S4)
 
  D.  P(S1)P(S2)和V(S2)V(S3)
 
 




 
 
相关试题     进程间的通信 

  第24题    2010年下半年  
进程P1、P2、P3、P4和P5的前趋图如下:
若用PV操作控制进程P1〜P5并发执行的过程,则需要设置6个信号量S1、S2、S3.S4.S5和S6,且信号量S1〜S6的初值都等于零。下图中a和b处应分..

  第26题    2009年下半年  
进程PI、P2、P3和P4的前趋图如下:

  第24题    2015年上半年  
进程P1、P2、P3、P4和P5的前趋图如下所示:

 
知识点讲解
· 同步与互斥
· 进程
· 进程的同步与互斥
· 信号
· 信号量
 
        同步与互斥
        同步是合作进程间的直接制约问题,互斥是申请临界资源进程间的间接制约问题。
        1)同步
        相互合作的进程需要在某些确定点上协调它们的工作,当一个进程到达这些点后,除非另一个进程已经完成某些操作;否则就不得不停下来等待这些操作结束。这就是进程间的同步。
        2)互斥
        在多道程序系统中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用,称为临界资源。这就产生了进程间的间接制约问题——互斥。
        3)临界区管理的原则
        临界区是进程中对临界资源实施操作的那段程序。互斥临界区管理的原则是:有空即进,无空则登;有限等待,让权等待。
 
        进程
        简单而言,一个进程就是一个正在运行的程序。一般来说,一个进程至少应该包括以下几个方面的内容。
        .相应的程序:进程既然是一个正在运行的程序,当然需要有相应程序的代码和数据。
        .CPU上下文:指程序在运行时,CPU中各种寄存器的当前值,包括:程序计数器,用于记录将要取出的指令的地址;程序状态字,用于记录处理器的运行状态信息;通用寄存器,用于存放数据或地址;段寄存器,用于存放程序中各个段的地址;栈指针寄存器,用于记录栈顶的当前位置。
        .一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地址空间、进程正在使用的文件等。
        进程有动态性、独立性和并发行三个特性。
        (1)动态性。进程是一个正在运行的程序,而程序的运行状态是在不断地变化的。例如,当一个程序在运行的时候,每执行完一条指令,PC寄存器的值就会增加,指向下一条即将执行的指令。而CPU中用来存放数据和地址的那些通用寄存器,它们的值肯定也不断地变化。另外,堆和栈的内容也在不断地变化,每当发生一次函数调用时,就会在栈中分配一块空间,用来存放此次函数调用的参数和局部变量。而当函数调用结束后,这块栈空间就会被释放掉。
        (2)独立性。一个进程是一个独立的实体,是计算机系统资源的使用单位。每个进程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进程。
        (3)并发性。从宏观上来看,在系统中同时有多个进程存在,它们相互独立地运行。
        下图表示四个进程A、B、C、D在系统中并发地运行。从中可以看出,虽然从宏观上来说,这四个进程都是在系统中运行,但从微观上来看,在任何一个特定的时刻,只有一个进程在CPU上运行。从时间上来看,开始是进程A在运行,然后是进程B在运行,然后是进程C和进程D。接下来又轮到了进程A去运行。因此,在单CPU的情形下,所谓的并发性,指的是宏观上并发运行,而微观上还是顺序运行,各个进程轮流去使用CPU资源。
        
        四个进程在并发运行
        在具体实现上,以CPU中的程序计数器PC为例,真正物理上的PC寄存器只有一个。当四个进程在轮流执行时,PC取值的运动轨迹是先在进程A内部流动,然后再到进程B的内部流动,再到进程C和D。从进程的独立性角度来说,每个进程都有“自己”独立的PC寄存器,即逻辑上的PC寄存器,它们的取值相互独立、互不影响。所谓的逻辑PC,其实就是一个内存变量。例如,在上图中,当进程A要执行的时候,就把A的逻辑PC的值拷贝到物理PC中,然后开始运行。当轮到B运行的时候,先把物理PC的当前值保存到A的逻辑PC中,然后再把B的逻辑PC的值装入到物理PC中,即可运行。这样就实现了各个进程的轮流运行。
 
        进程的同步与互斥
        在多道程序设计系统中,同一时刻可能有许多进程,这些进程之间存在两种基本关系:竞争关系和协作关系。
        第一种是竞争关系,系统中的多个进程之间彼此无关,它们并不知道其他进程的存在。例如,批处理系统中建立的多个用户进程,分时系统中建立的多个终端进程。由于这些进程共用了一套计算机系统资源,因而,必然要出现多个进程竞争资源的问题。当多个进程竞争共享硬设备、变量、表格、链表、文件等资源时,可能导致处理出错。
        (1)进程的互斥(Mutual Exclusion)。
        是解决进程间竞争关系的手段。指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源的进程释放该资源。临界区管理可以解决进程互斥问题。
        第二种是协作关系,某些进程为完成同一任务需要分工协作。
        (2)进程的同步(synchronization)。
        是解决进程间协作关系的手段。指一个进程的执行依赖于另一个进程的消息,当一个进程没有得到来自于另一个进程的消息时则等待,直到消息到达才被唤醒。
        不难看出,进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源。
               生产者-消费者问题
               下面通过例子来进一步阐明进程同步的概念。著名的生产者-消费者(Producer-Consumer)问题是计算机操作系统中并发进程内在关系的一种抽象,是典型的进程同步问题。在操作系统中,生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等。解决好了生产者-消费者问题就解决好了一类并发进程的同步问题。
               生产者-消费者问题表述如下:有n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲上,故又叫有界缓冲问题。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可投入缓冲区;类似地,只要缓冲区不空,消费者进程cj就可从缓冲区取走并消耗产品。
               可以把生产者-消费者问题的算法描述如下。
               
               其中,假如一般的高级语言都有sleep()和wakeup()这样的系统调用。从上面的程序可以看出,算法是正确的,两进程顺序执行结果也正确。但若并发执行,就会出现错误结果,出错的根源在于进程之间共享了变量counter,对counter的访问未加限制。
               生产者和消费者进程对counter的交替执行会使其结果不唯一。例如,counter当前值为8,如果生产者生产了一件产品,投入缓冲区,拟做conuter加1操作。同时消费者获取一个产品消费,拟做counter减1操作。假如两者交替执行加或减1操作,取决于它们的进行速度,counter的值可能是9,也可能是7,正确值应为8。
               操作系统实现进程同步的机制称为同步机制,它通常由同步原语组成。不同的同步机制采用不同的同步方法,迄今己设计出许多同步机制,最常用的同步机制:信号量及PV,管程。
               记录型信号量与PV操作
               1965年荷兰的计算机科学家E.W.Dijkstra提出了新的同步工具——信号量和P、V操作。他将交通管制中多种颜色的信号灯管理交通的方法引入操作系统,让两个或多个进程通过信号量(semaphore)展开交互。信号量仅能由同步原语对其进行操作,原语是操作系统中执行时不可中断的过程,即原子操作(Atomic Action)。Dijkstra发明了两个同步原语:P操作和V操作(荷兰语中“测试(Proberen)”和“增量(verhogen)”的头字母。利用信号量和P、V操作既可以解决并发进程的竞争问题,又可以解决并发进程的协作问题。
               使用PV操作实现同步时,对共享资源的管理分散在各个进程之中,进程能直接对共享变量进行处理,因此,难以防止有意或无意的违法同步操作,而且容易造成程序设计错误。如果能把有关共享变量的操作集中在一起,就可使并发进程之间的相互作用更为清晰,更容易编写出正确的并发程序。
               管程
               在1974年和1975年,霍尔(Hoare)和汉森(Brinch Hansen)提出了一个新的同步机制——管程。把系统中的资源用数据结构抽象地表示出来,因此,对资源的管理就可用数据及在其上实施操作的若干过程来表示;对资源的申请和释放通过过程在数据结构上的操作来实现。而代表共享资源的数据及在其上操作的一组过程就构成了管程,管程被请求和释放资源的进程所调用。
               管程是一种程序设计语言结构成分,便于用高级语言来书写,它和信号量有同等的表达能力。管程是由若干公共变量及其说明和所有访问这些变量的过程所组成的;进程可以互斥地调用这些过程;管程把分散在各个进程中互斥地访问公共变量的那些临界区集中了起来。管程可以作为语言的一个成分,采用管程作为同步机制便于用高级语言来书写程序,也便于程序正确性验证。
 
        信号
        任务间同步的另一种方式是异步信号。在两个任务之间,可以通过相互发送信号的方式,来协调它们之间的运行步调。
        所谓的信号,指的是系统给任务的一个指示,表明某个异步事件已经发生了。该事件可能来自于外部(如其他的任务、硬件或定时器),也可能来自于内部(如执行指令出错)。异步信号管理允许任务定义一个异步信号服务例程ASR(Asynchronous Signal Routine),与中断服务程序不同的是,ASR是与特定的任务相对应的。当一个任务正在运行的时候,如果它收到了一个信号,将暂停执行当前的指令,转而切换到相应的信号服务例程去运行。不过这种切换不是任务之间的切换,因为信号服务例程通常还是在当前任务的上下文环境中运行的。
        信号机制与中断处理机制非常相似,但又各有不同。它们的相同点是:
        .都具有中断性:在处理中断和异步信号时,都要暂时地中断当前任务的运行;
        .都有相应的服务程序;
        .都可以屏蔽响应:外部硬件中断可以通过相应的寄存器操作来屏蔽,任务也能够选择不对异步信号进行响应。
        信号机制与中断机制的不同点是:
        .中断是由硬件或特定的指令产生,而信号是由系统调用产生;
        .中断触发后,硬件会根据中断向量找到相应的处理程序去执行;而信号则通过发送信号的系统调用来触发,但系统不一定马上对它进行处理;
        .中断处理程序是在系统内核的上下文中运行,是全局的;而信号处理程序是在相关任务的上下文中运行,是任务的一个组成部分。
        实时系统中不同的任务经常需要互斥地访问共享资源。当任务试图访问资源时被正使用该资源的其他任务阻塞,可能出现优先级反转的现象,即当高优先级任务企图访问已被某低优先级任务占有的共享资源时,高优先级任务必须等待直到低优先级任务释放它占有的资源。如果该低优先级任务又被一个或多个中等优先级任务阻塞,问题就更加严重。由于低优先级任务得不到执行就不能访问资源、释放资源。于是低优先级任务就以一个不确定的时间阻塞高优先级的任务,导致系统的实时性没有保障。下图为是一个优先级反转的示例。
        
        一个优先级反转的示例
        如上图所示,系统存在任务1、任务2、任务3(优先级从高到低排列)和资源R。某时,任务1和任务2都被阻塞,任务3运行且占用资源R。一段时间后,任务1和任务2相继就绪,任务1抢占任务3运行,由于申请资源R失败任务1被挂起。由于任务2的优先级高于任务3,任务2运行。由于任务3不能运行和释放资源R,因此任务1一直被阻塞。极端情况下,任务1永远无法运行,处于饿死状态。
        解决优先级反转问题的常用算法有优先级继承和优先级天花板。
               优先级继承协议
               L. Sha、R. Rajkumar和J. P. Lehoczky针对资源访问控制提出了优先级继承协议(Priority Inheritance Protocol,PIP)。
               PIP协议能与任何优先级驱动的抢占式调度算法配合使用,而且不需要有关任务访问资源情况的先验知识。优先级继承协议的执行方式是:当低优先级任务正在使用资源,高优先级任务抢占执行后也要访问该资源时,低优先级任务将提升自身的优先级到高优先级任务的级别,保证低优先级任务继续使用当前资源,以尽快完成访问,尽快释放占用的资源。这样就使高优先级任务得以执行,从而减少高优先级任务被多个低优先级任务阻塞的时间。低优先级任务在运行中,继承了高优先级任务的优先级,所以该协议被称作优先级继承协议。
               由于只有高优先级任务访问正被低优先级任务使用的资源时,优先级继承才会发生,在此之前,高优先级任务能够抢占低优先级任务并执行,所以优先级继承协议不能防止死锁,而且阻塞是可以传递的,会形成链式阻塞。另外,优先级继承协议不能将任务所经历的阻塞时间减少到尽可能小的某个范围内。最坏情况下,一个需要μ个资源,并且与v个低优先级任务冲突的任务可能被阻塞min(μ,v)次。
               优先级冲顶协议
               J. B. Goodenough和L. Sha针对资源访问控制提出了优先级冲顶协议(Priority Ceiling Protocol,PCP)。
               PCP协议扩展了PIP协议,能防止死锁和减少高优先级任务经历的阻塞时间。该协议假设所有任务分配的优先级都是固定的,每个任务需要的资源在执行前就已确定。每个资源都具有优先级冲顶值,等于所有访问该资源的任务中具有的最高优先级。任一时刻,当前系统冲顶值(current priority ceiling)等于所有正被使用资源具有的最高冲顶值。如果当前没有资源被访问,则当前系统冲顶值等于一个不存在的最小优先级。当任务试图访问一个资源时,只有其优先级高于当前系统冲顶值,或其未释放资源的冲顶值等于当前系统冲顶值才能获得资源,否则会被阻塞。而造成阻塞的低优先级任务将继承该高优先级任务的优先级。
               已经证明,PCP协议的执行规则能防止死锁,但其代价是高优先级任务可能会经历优先级冲顶阻塞(Priority ceiling blocking)。即高优先级任务可能被一个正使用某资源的低优先级任务阻塞,而该资源并不是高优先级任务请求的。这种阻塞又被称作回避阻塞(avoidance blocking),意思是因为回避死锁而引起的阻塞。即使如此,在PCP协议下,每个高优先级任务至多被低优先级任务阻塞一次。使用PCP协议后,能静态分析和确定任务之间的资源竞争,计算出任务可能经历的最大阻塞时间,从而能分析任务集合的可调度性。在PCP协议下,高优先级任务被阻塞时会放弃处理器,因此,访问共享资源的任务可能会产生4次现场切换。
 
        信号量
        信号量是1965年由著名的荷兰计算机科学家Dijkstra提出的,其基本思路是使用一种新的变量类型,即信号量来记录当前可用资源的数量。
        在信号量的具体实现上,有两种不同的方式。
        (1)方式一:要求信号量的取值必须大于或等于0。如果信号量的值等于0,表示当前已没有可用的空闲资源;如果信号量的值大于0,则该值就代表了当前可用的空闲资源数量;
        (2)方式二:信号量的取值可正可负。如果是正数或0,其含义与方式一是相同的;如果是负数,则它的绝对值就代表正在等待进入临界区的任务个数。
        信号量是由操作系统来维护的,任务不能直接去修改它的值,只能通过初始化和两个标准原语(即P、V原语)来对它进行访问。在初始化时,可以指定一个非负整数,即空闲资源的总数。所谓的原语,通常由若干条语句组成,用来实现某个特定的操作,并通过一段不可分割或不可中断的程序来实现其功能。原语是操作系统内核的一个组成部分,必须在内核态下执行。原语的不可中断性是通过在其执行过程中关闭中断来实现的。
        P、V原语作为操作系统内核代码的一部分,是一种不可分割的原子操作。它们在运行时,不会被时钟中断所打断。另外,在P、V原语中包含有任务的阻塞和唤醒机制,因此,当任务在等待进入临界区的时候,会被阻塞起来,而不会去浪费CPU时间。
        P原语中的字母P,是荷兰语单词测试的首字母。它的主要功能是申请一个空闲的资源,把信号量的值减1。如果成功的话,就退出原语;如果失败的话,这个任务就会被阻塞起来。V原语当中的字母V,是荷兰语单词增加的首字母。它的主要功能是释放一个被占用的资源,把信号量的值加1,如果发现有被阻塞的任务,就从中选择一个把它唤醒。
        采用信号量来实现任务之间的互斥,优点有两个:一是可以设置信号量的计数值,从而允许多个任务同时进入临界区;二是当一个任务暂时无法进入临界区时,它会被阻塞起来,从而让出CPU给其他的任务。
        大多数嵌入式操作系统都提供了信号量的机制,用户可以通过函数调用的方式去使用。



更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2023 All Rights Reserved
软考在线版权所有