死锁和饥饿案例分析.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
15分钟 每个哲学家首先拿起左边的叉子,然后拿起右边的叉子,吃完后,这两副叉子又被放回桌子 一、提问:是否正确 二、分析出现死锁的原因: 1 先画出进程的三种基本状态 2 时间片轮转时CPU上的进程、就绪队列、fork信号量以及其上的阻塞队列的变化情况分析 3 画出循环等待的资源分配图。 10分钟 4个人开始就餐,一定至少有一个可以拿到两叉 证明:反证法 问题描述3分钟 问题描述3分钟 问题描述3分钟 10分钟 解法一:奇数号哲学家先拿他左边的筷子,偶数号哲学家先拿他右边的筷子。这样破坏了同方向环路,一个哲学家拿到一只筷子后,就阻止了他邻座的一个哲学家吃饭。 * 指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程), ;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。 Windows操作系统下的管道命令 C:\windows\dir | more msgget()—获得消息队列的标识符 The first parameter refers to a security attribute for the mutex lock. The second parameter indicates whether the creator of the mutex lock is the lock’s initial owner. The third parameter allows us to name the mutex. the initial value of the semaphore is 1, and its maximum valueis 5. 管道 “管道”,是一个环形缓冲区,允许两个进程以生产者/消费者的模型进行通信。它是一个先进先出(FIFO)队列,由一个发送进程以字符流形式将大量的数据写入管道,而由另一个接受进程读出。 管道是单向的,常用于命令行所指定的输入输出重定向和管道命令。 管道机制中的互斥与同步 互斥:当一个进程正在对管道执行读/写操作时,另一进程必须等待。 同步: 写进程把一定数量(如4 KB)的数据写入管道,便去睡眠等待, 直到读进程取走数据后,再把它唤醒。 当读进程读一空管道时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。 管道命令 Unix/Linux中的管道命令 命令格式:$ command1 | command2 每个command命令作为一个进程运行,前一个作为输入,后一个作为输出 $ cat file | wc Windows中的管道命令 C:\windows\ dir | more 命名管道和匿名管道 匿名管道:使用内存实现进程通信,只适用于父子进程之间或父进程安排的各个子进程之间,临时信息通信。 通过pipe(int fildes[2])系统调用,得到两个文件描述符,fildes[0]为读端,fildes[1]为写端 通过系统调用write和read进行管道的写和读 命名管道:借助于磁盘在任意进程间通信,永久信息通信。 通过mknod系统调用建立命名管道 通过系统调用write和read进行管道的写和读; 匿名管道-实例 main() { int fd[2]; char a[30],b[30]; pipe(fd); if (fork()==0) { scanf(“%s”,a); write(fd[1],a,30); exit(0); } if(fork()==0) { read(fd[0],b,30); printf(“%s\n”,b); exit(0); } wait(0); wait(0); } 父 子1 子2 fd[1] fd[0] 演示 消息 Unix/Linux用消息缓冲队列(信箱)在进程间以异步方式发送消息。 消息包括: 首部和正文区 创建消息队列的系统调用msgget() 控制消息队列的系统调用msgctl() 发送与接收消息的系统调用msgsnd()、msgrcv() 消息 – 实例 使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1k的消息发送和接受程序。 在主程序中先后fork()两个子进程server和client进行通信。 server端建立一个key为75的消息队列,等待其他进程发送来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出server。server每接收到一个消息后显示一句“(server)received”。 client

文档评论(0)

a1166671 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档