- 1、本文档共205页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(1)设置进程和管程的目的不同 (2)系统管理数据结构 进程:PCB 管程:等待队列 (3)管程被进程调用 (4)管程是操作系统的固有成分,无创建和撤消 7.管程和进程的异同点 第二章???进程管理 2.6 进程通信 1.进程通信概述 P.V操作实现的是进程之间的低级通讯,所以P.V为低级通讯原语。它只能传递简单的信号,不能传递交换大量信息 如果要在进程间传递大量信息则要用Send / Receive原语(高级通讯原语) 2.实现进程通信的方式 共享存储器方式:相互通信的进程通过共享某些数据结构或存储区来进行通信,可分为共享数据结构方式、共享存储区方式; 消息通信方式:进程间的消息交换以消息或报文为单位,程序员利用一组通信命令(原语)来实现通信,可分为直接、间接通信方式; 共享文件方式:利用共享文件来实现进程间的通信。 3.管道通信 在UNIX系统中,利用一个打开的共享文件来连接两个相互通信的进程,该共享文件称为管道(Pipe),因而该方式又称为管道通信。 为了协调双方通信,管道通信必须提供三方面的协调能力:互斥、同步、对方是否存在。 4.消息传递模式 系统为进程提供了两个高级通讯原语send和receive。要进行消息传递时执行send ,当接收者要接收消息时执行receive 消息缓冲:在内存中开设缓冲区,发送进程将消息送入缓冲区,接收进程接收传递来的缓冲区 信箱通信 5.直接方式 共享文件模式:管道通信发送进程发消息时要指定接收进程的名字, 反过来,接收时要指明发送进程的名字 Send(receiver,message) Receiver(sender,message) 对称形式:一对一 非对称形式:多对一 (顾客/服务员) 有缓冲(有界,无界),无缓冲 直接通信方式 直接通信方式模型 6.消息缓冲(有界缓冲区) 在操作系统空间设置一组缓冲区,当发送进程需要发送消息时,执行send系统调用,产生自愿性中断,进入操作系统,操作系统为发送进程分配一个空缓冲区,并将所发送的消息从发送进程copy到缓冲区中,然后将该载有消息的缓冲区连接到接收进程的消息链链尾,如此就完成了发送过程。发送进程返回到用户态继续执行。 在以后某个时刻,当接收进程执行到receive接收原语时,也产生自愿性中断进入操作系统,由操作系统将载有消息的缓冲区从消息链中取出,并把消息内容copy到接收进程空间,之后收回缓冲区,如此就完成了消息的接收,接收进程返回到用户态继续进行。 P.V操作讨论 1) 信号量的物理含义: S0表示有S个资源可用 S=0表示无资源可用 S0则| S |表示S等待队列中的进程个数 P(S):表示申请一个资源 V(S)表示释放一个资源。信号量的初值应该大于等于0 2) P.V操作必须成对出现,有一个P操作就一定有一个V操作 当为互斥操作时,它们同处于同一进程 当为同步操作时,则不在同一进程中出现 如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至 关重要,一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前 而两个V操作无关紧要 P.V操作的优缺点 P.V操作优点: 简单,而且表达能力强(用P.V操作可解决任何同步互斥问题) 缺点: “不够安全;P.V操作使用不当会出现死锁;遇到复杂同步互斥问题时实现复杂 9.信号量集——AND型信号量集 AND型信号量集是指同时需要多种资源且每种占用一个时的信号量操作 AND型信号量集的基本思想:在一个原语中申请整段代码需要的多个临界资源,要么全部分配给它,要么一个都不分配 AND型信号量集P原语为Swait AND型信号量集V原语为Ssignal Swait(S1, S2, …, Sn) //P原语; { while (TRUE) { if (S1 =1 S2 = 1 … Sn = 1) { //满足资源要求时的处理; for (i = 1; i = n; ++i) -–Si; //注:与P的处理不同,这里是在确信可满足 // 资源要求时,才进行减1操作; break; } else { //某些资源不够时的处理; 调用进程进入第一个小于1信号量的等待队列Sj.queue; 阻塞调用进程; } Ssignal(S1, S2, …, Sn) { for (i = 1; i = n; ++i) { ++Si; //释放占用的资源; for (在Si.qu
文档评论(0)