- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
管道通信方式 Pipe 也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质 管道是一条在进程间以字节流方式传送的通信通道。它由OS核心的缓冲区(通常几十KB)来实现,是单向的;常用于命令行所指定的输入输出重定向和管道命令。在使用管道前要建立相应的管道,然后才可使用。 UNIX管道 通过pipe系统调用创建无名管道,得到两个文件描述符,分别用于写和读。 int pipe(int fildes[2]); 文件描述符fildes[0]为读端,fildes[1]为写端; 通过系统调用write和read进行管道的写和读; 进程间双向通信,通常需要两个管道; 只适用于父子进程之间或父进程安排的各个子进程之间; UNIX中的命名管道,可通过mknod系统调用建立:指定mode为S_IFIFO int mknod(const char *path, mode_t mode, dev_t dev); 管道通信方式 Pipe 也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质 发送进程 接收进程 字符流方式写入读出 先进先出顺序 作业 1.管程的作用 2.消息缓冲通信的过程 * * 复习 And型信号量机制 一般信号量集机制 读者—写者 问题 信号量作用 初值 哲学家就餐问题 怎样不死锁 10. 有一阅览室,读者进入时必须先在一张登记表上进行登记,该表为每一座位列一表目,包括座号和读者姓名。读者离开时要消掉登记信号,阅览室中共有100个座位,请问: (1) 为描述读者的动作,应编写几个程序?设置几个进程?进程与程序间的对应关系如何? (2) 用类Pascal语言和Wait, Signal操作写出这些进程间的同步算法。 答:(1) 应设置2个进程;进程与程序间的对应关系是:多对1。信号量S1:还有几个座位;S2:已经有多少读者;mutex:互斥。 (2) begin S1:=100 (有100个座位) S2:=0 (没有阅读者) mutex: =1 cobegin InP: repeat P(S1); P(mutex); 登记信息; V(muetx); V(S2)就座,阅读; until false coend end OutP: repeat P(S2) P(mutex); 消掉信息; V(muetx); V(S1); 离开阅览室; until false 管 程 更为高级的同步机构中, 最重要的是管程 建立管程的基本理由: 由于临界区的执行分散在各进程中, PV操作可能分布在各个程序中,很难看出在信号量上的操作所产生的整体效果;也很难发现和纠正分散在用户程序中的对同步原语的错误使用等问题,也不便于系统对临界资源的控制和管理 开锁、关锁原语和信号量上的 wait、signal 操作,是低级的同步机构,很难表示更为复杂的并发性问题 解决:把分散的各同类临界区集中起来,并为每个可共享资源设立一个专门的管程来统一管理各进程对该资源的访问,这样既便于系统管理共享资源,又能保证互斥访问 局部于管程内的数据结构只能被局部于管程内的过程所访问,不能被管程外的过程对其进行操作。 反之,局部于管程内的过程只能访问管程内的数据结构。因此管程相当于围墙一样把共享变量(数据结构)和对它进行的若干操作过程围了起来。进程要共享资源(进入围墙使用某操作过程)就必须经过管程(围墙的门)才能进入,管程每次只允许一个进程进入管程内,即互斥地访问共享资源。 管 程—管程的定义 管程定义了一个数据结构和能为并发进程所执行的一组操作。这组操作能同步进程和改变管程中的数据。 临界资源的管理者或封装者,进程必须通过管程访问临界资源 管程主要由三部分组成: 局部于该管程的共享数据,这些数据表示了相应的资源 局部于该管程的局部过程,由这些过程对临界资源进行操作 对局部于管程的共享变量说明。 管程一次只允许一个进程进入其内(即访问管程内的某个过程)——这是由编译系统保证。 monitor diningPhilosophers { int[] state = new int[5]; static final int THINKING = 0; static final int HUNGRY = 1; static final int EATING = 2; condition[] self = new condition[5]; public diningPhilosophers { for (
文档评论(0)