操作系统管程机制课件_第1页
操作系统管程机制课件_第2页
操作系统管程机制课件_第3页
操作系统管程机制课件_第4页
操作系统管程机制课件_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.管程的定义

Hansen为管程下的定义是:“一个管程(monitor)定义了一种数据结构和并发进程在该数据结构上执行的一组操作,这组操作用来实现进程间的同步和改变管程中的数据”。用管程管理循环缓冲区时,要给出管程名称,给出与所管理的共享资源(缓冲区)有关的数据结构,给出在数据结构上执行的一组操作,以及数据结构的初始化代码。如图示。局部数据、条件变量、一组操作都属于定义性质的,初始化代码才是真正的管程体。8.4管程机制

第1页/共28页2.管程的定义Hansen为管程下的定义1用管程管理循环缓冲区时管程的定义。8.4管程机制

第2页/共28页用管程管理循环缓冲区时管程的定义。8.4管程机制第2页2局部数据和条件变量(2)条件变量是一种特殊变量,当进程在管程定义的操作中使用共享资源时,若无法继续运行,就在某个条件变量上执行wait()操作等待,将管程让给等候在管程外的进程使用,直等到有进程在该条件变量上做signal()操作才被唤醒。(1)局部数据是管程管理的共享资源的数据结构,是对共享资源的抽象。(3)条件变量不是计数器,也不像信号量那样对信号进行累计。若向有关条件变量发送信号(即调用signal()操作),而在该条件变量上没有等待的进程,那么信号就丢失。8.4管程机制

第3页/共28页局部数据和条件变量(2)条件变量是一种特殊变量,当进程在管3(2)管程中定义的函数分两类:外部函数是那些进程可从外部调用的函数,是进程进入管程的入口;内部函数是只能由管程内的函数调用的函数,进程不知道它们的存在,不能调用它们。建立在局部数据和条件变量上的一组操作(1)管程管理的数据结构只能由在管程内部定义的函数访问,管程外部的函数不能作用在它们上面。(3)管程犹如一堵“围墙”,把共享变量代表的资源及对资源的操作围圈在管程内。进程要使用共享资源,只有通过管程提供的入口(即外部函数)才能够进入管程。另外管程一次只允许一个进程进入,以此保证对资源互斥地访问。8.4管程机制

第4页/共28页(2)管程中定义的函数分两类:外部函数是那些进程可从外部调4

管程管理的共享资源在使用前需要初始化,管程中的初始化代码部分完成这样的功能。由于前面两个部分给出的都是相关的定义,因此初始化代码是管程的管程体。管程数据结构的初始化代码8.4管程机制

第5页/共28页管程管理的共享资源在使用前需要初始化,5右侧是组成管程的三个部分,入口处的外面有请求进入管程的进程队列。左侧的管程等待区是各种等待队列。管程内部针对不同的条件变量,设置各种等待队列,以区分不同的等待原因。这些等待队列都在该管程的等待区里。条件c1队列cwait(c1)条件cn队列cwait(cn)紧急队列csignal局部数据(共享资源或数据结构)条件变量操作1:操作k:初始化代码请求进入管程队列入口退出管程等待区:管程:管程的结构8.4管程机制

第6页/共28页右侧是组成管程的三个部分,入口处的外面有请求进6在执行管程中定义的操作时,会因执行signal(ci)而将某个进程从条件变量ci的等待队列里唤醒。由于这些被唤醒的进程已经在管程中执行了部分任务,它们理应有比那些还没有进入管程的进程(即管程入口处请求进入的进程)优先得到执行的权利。因此,常把这些进程排成“紧急队列”。条件c1队列cwait(c1)条件cn队列cwait(cn)紧急队列csignal局部数据(共享资源或数据结构)条件变量操作1:操作k:初始化代码请求进入管程队列入口退出管程等待区:管程:8.4管程机制

第7页/共28页在执行管程中定义的操作时,会因执行signal7例8-7:利用例8-6管理缓冲区的管程,解决“生产者-消费者”问题。

在生产者进程里,由函数produce(x)生产一个产品,暂时放在变量x中。然后调用管程提供的入口函数append(x),试图把x里的产品存放到缓冲区去,控制进入到管程buffer。8.4管程机制

第8页/共28页例8-7:利用例8-6管理缓冲区的管程,解决“生产者-消费8

append(x)检查缓冲区计数器,在in的指示下,把产品放到缓冲区指定位置。执行signal(empty)时,由于没有等待的消费者,故什么也不做就结束生产者进程的执行。若在append(x)还未执行signal(empty)时,有生产者或消费者进程到来,那么这些进程只能在管程外的等待进入队列里排队,等到执行signal(empty)后,才一个个地进入管程,从而保证使用管程管理资源的互斥性。利用管程,解决“生产者-消费者”问题。

8.4管程机制

第9页/共28页append(x)检查缓冲区计数器,在in的9若用完了n个缓冲区的位置。假定生产了第n+1个产品,并通过函数append(x)进入管程。这时,由于“count==N”成立,因此做操作“wait(full)”,该生产者进程就在有关full的条件变量队列里等待唤醒。利用管程,解决“生产者-消费者”问题。

8.4管程机制

第10页/共28页若用完了n个缓冲区的位置。假定生产了第n+10

进入管程的消费者进程首先调用管程的take(x)操作,以便从缓冲区里取出产品。8.4管程机制

第11页/共28页进入管程的消费者进程首先调用管程的tak118.2.1实现互斥的硬件方法

1.中断禁止

所谓“中断禁止”,是指进程以禁止中断的方法,构成临界区的进入区;以开中断的方法,构成临界区的退出区。8.2实现互斥的方法讨论

由于禁止中断后,时钟中断和其他中断都遭封杀,就不会发生CPU进行进程切换的事情。所以,通过中断禁止的办法,完全不必担心别的进程会进入临界区。这时程序的结构如图所示。禁止中断对于操作系统来说是实现互斥的一项很有用的技术。在系统内核中,利用它来保证访问共享资源的安全是方便的。第12页/共28页8.2.1实现互斥的硬件方法1.中断禁止12

由于禁止中断后,时钟中断和其他中断都遭封杀,就不会发生CPU进行进程切换的事情。所以,通过中断禁止的办法,完全不必担心别的进程会进入临界区。这时程序的结构如图所示。

8.2实现互斥的方法讨论

第13页/共28页由于禁止中断后,时钟中断和其他中断都遭封杀,13

一些计算机中有专门指令,功能是将内存单元的内容读到寄存器中,然后往该单元里写入一个非零值,且读和写操作是不可分割(即在一个指令周期内完成)。这种指令称为“测试并上锁(TSL)”。格式是:

TSLR,x8.2实现互斥的方法讨论

2.专用机器指令

第14页/共28页一些计算机中有专门指令,功能是将内存单元的14

程序中可利用TSL指令形成临界区的进入区,确保进程临界区间的执行是互斥的。如图所示是汇编语言程序中指令TSL的具体安排。

图中通过指令TSL把变量x里当前值读入寄存器R,同时把变量x设置为1。这样,寄存器R里保存的是变量x的原值,x的新值为1。8.2实现互斥的方法讨论

指令: CMPR,#1 JNEenter_section用于测试到变量x的原先值为1时,表明已有进程在其临界区里,别的进程就不能进入;只有在测试到变量x的原先值为0时,请求加入临界区的进程才能够进入它的临界区。也就是说,变量x起到一把“锁”的作用。

由指令MOVEx,#0完成退出临界区的功能,即把变量x设置为0。只有把“锁”x打开了,别的进程才可有机会进入自己的临界区。

利用指令TSL确实能够保证临界区的互斥,其缺点是当已有进程在临界区里时,欲进入临界区的进程就必须不断地去循环执行TSL指令和测试寄存器R的值,从而形成所谓的“忙等待”。第15页/共28页程序中可利用TSL指令形成临界区的进入区,确保158.2.2实现互斥的软件方法

8.2实现互斥的方法讨论

第16页/共28页8.2.2实现互斥的软件方法8.2实现互斥的方法讨论16如图是用类C语言描述的Peterson给出①进入临界区的方法:enter_section()

②退出临界区的方法:

exit_section()。8.2实现互斥的方法讨论

第17页/共28页如图是用类C语言描述的Peterson给出①进入临界区的方法17在算法里,用两个共享的量控制进程进入临界区:由变量turn的取值是0还是1,表示现在轮到哪个进程进入临界区;由数组元素interested[],它以进程号(0或1)为下标,表示该进程是否有兴趣进入临界区。8.2实现互斥的方法讨论

第18页/共28页在算法里,用两个共享的量控制进程进入临界区:由变量turn的188.2实现互斥的方法讨论

Peterson算法是正确的,但遗憾的是它也存在忙等待的缺点。第19页/共28页8.2实现互斥的方法讨论Peterson算法是正确的,但198.5高级进程通信

用P、V操作实现的通信,称为进程间的低级通信。为使进程间能真正交换数据,操作系统设计有高级通信命令,提供给用户在程序一级使用。只要准备好所需的参数,直接调用它们就能在进程间传递大量信息。8.5.1消息缓冲通信

消息缓冲通信是一种直接通信方式,基本思想是消息发送者在自己的消息发送区形成消息,向系统申请消息缓冲区,把数据从消息发送区移到消息缓冲区中。通过发送命令,把这个消息缓冲区直接发送到消息接收者的消息队列里。接收者从自己的消息队列上摘下消息缓冲区,把里面的数据移到自己的消息接收区里,释放消息缓冲区。第20页/共28页8.5高级进程通信用P、V操作实20为实现消息缓冲通信,要解决如下问题:

(1)开辟消息缓冲区,每个消息缓冲区的构成是:发送消息的进程名或标识name;发送消息的长度size;发送消息的正文内容text;下一个消息缓冲区的指针nPtr。(2)系统要提供发送消息和接收消息的系统调用命令。比如发送命令为Send,接收命令为Receive。(3)进程PCB中增设管理消息队列的内容,它们是:消息队列的队首指针hPtr;mutex——在发送和接收中,Send和Receive都要操作,保证对进程消息队列进行互斥操作的信号量mutex,初值为1。8.5高级进程通信

第21页/共28页为实现消息缓冲通信,要解决如下问题:(1)开辟消息缓冲区21系统中两进程间进行直接数据传送的通信过程

8.5高级进程通信

第22页/共28页系统中两进程间进行直接数据传送的通信过程8.5高级进程通228.5高级进程通信

发送消息命令Send的工作步骤(1)向系统申请一个消息缓冲区;(2)填写消息缓冲区,并将消息发送区里的内容送入缓冲区;(3)根据接收进程名B,找到它的PCB,把消息缓冲区链入它的消息队列队尾。第23页/共28页8.5高级进程通信发送消息命令Send的工作步骤(1)238.5高级进程通信

接收消息的命令Receive的工作步骤(1)从自己的消息队列上摘下第1个消息缓冲区;(2)将消息缓冲区里的内容送入消息接收区;(3)释放所占用的消息缓冲区。第24页/共28页8.5高级进程通信接收消息的命令Receive的工作步骤24Receive的处理流程Send的处理流程8.5高级进程通信

第25页/共28页Receive的处理Send的处理8.5高级进程通信258.5.2信箱通信

信箱通信也称间接通信,指进程间通过信箱来传递消息。基本思想是一个进程与另一个进程进行通信时,先创建链接这两个进程的信箱。然后,发送者把消息投入与接收者相连的信箱,接收者从信箱里接收所需要的消息。信箱由“信箱头(或信箱说明)”和“信箱体”两部分组成,如图所示。8.5高级进程通信

第26页/共28页8.5.2信箱通信信箱通信也称间接通信26信箱由“信箱头(或信箱说明)”和“信箱体”两部分组成。

信箱头给出信箱大小(size)、存信件指针(inPtr)、取信件指针(outPtr)、空闲格子信号量(si)以及信件格子信号量(so)等管理信息。信箱体用来存放消息,每个消息放在一个格子里。8.5高级进程通信

第27页/共28页信箱由“信箱头(或信箱说明)”和“信箱体”两部分组成。27感谢您的观看!第28页/共28页感谢您的观看!第28页/共28页282.管程的定义

Hansen为管程下的定义是:“一个管程(monitor)定义了一种数据结构和并发进程在该数据结构上执行的一组操作,这组操作用来实现进程间的同步和改变管程中的数据”。用管程管理循环缓冲区时,要给出管程名称,给出与所管理的共享资源(缓冲区)有关的数据结构,给出在数据结构上执行的一组操作,以及数据结构的初始化代码。如图示。局部数据、条件变量、一组操作都属于定义性质的,初始化代码才是真正的管程体。8.4管程机制

第1页/共28页2.管程的定义Hansen为管程下的定义29用管程管理循环缓冲区时管程的定义。8.4管程机制

第2页/共28页用管程管理循环缓冲区时管程的定义。8.4管程机制第2页30局部数据和条件变量(2)条件变量是一种特殊变量,当进程在管程定义的操作中使用共享资源时,若无法继续运行,就在某个条件变量上执行wait()操作等待,将管程让给等候在管程外的进程使用,直等到有进程在该条件变量上做signal()操作才被唤醒。(1)局部数据是管程管理的共享资源的数据结构,是对共享资源的抽象。(3)条件变量不是计数器,也不像信号量那样对信号进行累计。若向有关条件变量发送信号(即调用signal()操作),而在该条件变量上没有等待的进程,那么信号就丢失。8.4管程机制

第3页/共28页局部数据和条件变量(2)条件变量是一种特殊变量,当进程在管31(2)管程中定义的函数分两类:外部函数是那些进程可从外部调用的函数,是进程进入管程的入口;内部函数是只能由管程内的函数调用的函数,进程不知道它们的存在,不能调用它们。建立在局部数据和条件变量上的一组操作(1)管程管理的数据结构只能由在管程内部定义的函数访问,管程外部的函数不能作用在它们上面。(3)管程犹如一堵“围墙”,把共享变量代表的资源及对资源的操作围圈在管程内。进程要使用共享资源,只有通过管程提供的入口(即外部函数)才能够进入管程。另外管程一次只允许一个进程进入,以此保证对资源互斥地访问。8.4管程机制

第4页/共28页(2)管程中定义的函数分两类:外部函数是那些进程可从外部调32

管程管理的共享资源在使用前需要初始化,管程中的初始化代码部分完成这样的功能。由于前面两个部分给出的都是相关的定义,因此初始化代码是管程的管程体。管程数据结构的初始化代码8.4管程机制

第5页/共28页管程管理的共享资源在使用前需要初始化,33右侧是组成管程的三个部分,入口处的外面有请求进入管程的进程队列。左侧的管程等待区是各种等待队列。管程内部针对不同的条件变量,设置各种等待队列,以区分不同的等待原因。这些等待队列都在该管程的等待区里。条件c1队列cwait(c1)条件cn队列cwait(cn)紧急队列csignal局部数据(共享资源或数据结构)条件变量操作1:操作k:初始化代码请求进入管程队列入口退出管程等待区:管程:管程的结构8.4管程机制

第6页/共28页右侧是组成管程的三个部分,入口处的外面有请求进34在执行管程中定义的操作时,会因执行signal(ci)而将某个进程从条件变量ci的等待队列里唤醒。由于这些被唤醒的进程已经在管程中执行了部分任务,它们理应有比那些还没有进入管程的进程(即管程入口处请求进入的进程)优先得到执行的权利。因此,常把这些进程排成“紧急队列”。条件c1队列cwait(c1)条件cn队列cwait(cn)紧急队列csignal局部数据(共享资源或数据结构)条件变量操作1:操作k:初始化代码请求进入管程队列入口退出管程等待区:管程:8.4管程机制

第7页/共28页在执行管程中定义的操作时,会因执行signal35例8-7:利用例8-6管理缓冲区的管程,解决“生产者-消费者”问题。

在生产者进程里,由函数produce(x)生产一个产品,暂时放在变量x中。然后调用管程提供的入口函数append(x),试图把x里的产品存放到缓冲区去,控制进入到管程buffer。8.4管程机制

第8页/共28页例8-7:利用例8-6管理缓冲区的管程,解决“生产者-消费36

append(x)检查缓冲区计数器,在in的指示下,把产品放到缓冲区指定位置。执行signal(empty)时,由于没有等待的消费者,故什么也不做就结束生产者进程的执行。若在append(x)还未执行signal(empty)时,有生产者或消费者进程到来,那么这些进程只能在管程外的等待进入队列里排队,等到执行signal(empty)后,才一个个地进入管程,从而保证使用管程管理资源的互斥性。利用管程,解决“生产者-消费者”问题。

8.4管程机制

第9页/共28页append(x)检查缓冲区计数器,在in的37若用完了n个缓冲区的位置。假定生产了第n+1个产品,并通过函数append(x)进入管程。这时,由于“count==N”成立,因此做操作“wait(full)”,该生产者进程就在有关full的条件变量队列里等待唤醒。利用管程,解决“生产者-消费者”问题。

8.4管程机制

第10页/共28页若用完了n个缓冲区的位置。假定生产了第n+38

进入管程的消费者进程首先调用管程的take(x)操作,以便从缓冲区里取出产品。8.4管程机制

第11页/共28页进入管程的消费者进程首先调用管程的tak398.2.1实现互斥的硬件方法

1.中断禁止

所谓“中断禁止”,是指进程以禁止中断的方法,构成临界区的进入区;以开中断的方法,构成临界区的退出区。8.2实现互斥的方法讨论

由于禁止中断后,时钟中断和其他中断都遭封杀,就不会发生CPU进行进程切换的事情。所以,通过中断禁止的办法,完全不必担心别的进程会进入临界区。这时程序的结构如图所示。禁止中断对于操作系统来说是实现互斥的一项很有用的技术。在系统内核中,利用它来保证访问共享资源的安全是方便的。第12页/共28页8.2.1实现互斥的硬件方法1.中断禁止40

由于禁止中断后,时钟中断和其他中断都遭封杀,就不会发生CPU进行进程切换的事情。所以,通过中断禁止的办法,完全不必担心别的进程会进入临界区。这时程序的结构如图所示。

8.2实现互斥的方法讨论

第13页/共28页由于禁止中断后,时钟中断和其他中断都遭封杀,41

一些计算机中有专门指令,功能是将内存单元的内容读到寄存器中,然后往该单元里写入一个非零值,且读和写操作是不可分割(即在一个指令周期内完成)。这种指令称为“测试并上锁(TSL)”。格式是:

TSLR,x8.2实现互斥的方法讨论

2.专用机器指令

第14页/共28页一些计算机中有专门指令,功能是将内存单元的42

程序中可利用TSL指令形成临界区的进入区,确保进程临界区间的执行是互斥的。如图所示是汇编语言程序中指令TSL的具体安排。

图中通过指令TSL把变量x里当前值读入寄存器R,同时把变量x设置为1。这样,寄存器R里保存的是变量x的原值,x的新值为1。8.2实现互斥的方法讨论

指令: CMPR,#1 JNEenter_section用于测试到变量x的原先值为1时,表明已有进程在其临界区里,别的进程就不能进入;只有在测试到变量x的原先值为0时,请求加入临界区的进程才能够进入它的临界区。也就是说,变量x起到一把“锁”的作用。

由指令MOVEx,#0完成退出临界区的功能,即把变量x设置为0。只有把“锁”x打开了,别的进程才可有机会进入自己的临界区。

利用指令TSL确实能够保证临界区的互斥,其缺点是当已有进程在临界区里时,欲进入临界区的进程就必须不断地去循环执行TSL指令和测试寄存器R的值,从而形成所谓的“忙等待”。第15页/共28页程序中可利用TSL指令形成临界区的进入区,确保438.2.2实现互斥的软件方法

8.2实现互斥的方法讨论

第16页/共28页8.2.2实现互斥的软件方法8.2实现互斥的方法讨论44如图是用类C语言描述的Peterson给出①进入临界区的方法:enter_section()

②退出临界区的方法:

exit_section()。8.2实现互斥的方法讨论

第17页/共28页如图是用类C语言描述的Peterson给出①进入临界区的方法45在算法里,用两个共享的量控制进程进入临界区:由变量turn的取值是0还是1,表示现在轮到哪个进程进入临界区;由数组元素interested[],它以进程号(0或1)为下标,表示该进程是否有兴趣进入临界区。8.2实现互斥的方法讨论

第18页/共28页在算法里,用两个共享的量控制进程进入临界区:由变量turn的468.2实现互斥的方法讨论

Peterson算法是正确的,但遗憾的是它也存在忙等待的缺点。第19页/共28页8.2实现互斥的方法讨论Peterson算法是正确的,但478.5高级进程通信

用P、V操作实现的通信,称为进程间的低级通信。为使进程间能真正交换数据,操作系统设计有高级通信命令,提供给用户在程序一级使用。只要准备好所需的参数,直接调用它们就能在进程间传递大量信息。8.5.1消息缓冲通信

消息缓冲通信是一种直接通信方式,基本思想是消息发送者在自己的消息发送区形成消息,向系统申请消息缓冲区,把数据从消息发送区移到消息缓冲区中。通过发送命令,把这个消息缓冲区直接发送到消息接收者的消息队列里。接收者从自己的消息队列上摘下消息缓冲区,把里面的数据移到自己的消息接收区里,释放消息缓冲区。第20页/共28页8.5高级进程通信用P、V操作实48为实现消息缓冲通信,要解决如下问题:

(1)开辟消息缓冲区,每个消息缓冲区的构成是:发送消息的进程名或标识name;发送消息的长度size;发送消息的正文内容text;下一个消息缓冲区的指针nPtr。(2)系统要提供发送

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论