操作系统--课堂问答笔记09--习题答案
课堂笔记学习视频来自 操作系统
说明:其他”课堂问答笔记“也在”操作系统“专栏
【2-4】
-
为什么要把生产者消费者问题的整个缓冲区(仓库)看成互斥的共享资源?这是上节课的遗留问题
因为如果不看成互斥的共享资源,可能会出现多个生产者进程对同一个空缓冲区同时投放数据或者是多个消费者进程对同一个满缓冲区同时提取数据的情况。
因为缓冲区是通过数组实现的,那么就应该实现对该数组的互斥访问。试想一下,若有多个生产者同时访问下标为i的数组元素(即多个生产者都往这里放产品,因为开始时这里是空的,当然都可以往这里放)会发生什么情况;
多个消费者同时访问下标为i的数组元素(即多个消费者都从这里取产品)道理也是一样。
如果只有一个生产者和一个消费者,那不存在这样的没问题。
多个生产者同时访问下标为i的数组元素或多个消费者同时访问下标为i的数组元素,这就有问题,就像多个售票窗口同时卖同一趟车的票。
不改进的版本是任何两人不能同时访问。
改进后生产者和消费者可以同时访问;多个生产者或者多个消费者还是不能同时访问。
ZGS版的实现原理是保证只有一个生产者可以使用写指针out,也只有一个消费者可以使用读指针in。
ZGS版保证任何时刻最多两个人在使用缓冲区,且这二人一个时生产者一个是消费者。
任何时刻可以0,1,2人同时使用,不改进的:任何时刻可以0,1人同时使用。 -
如何更好地理解在生产者进程中wait(empty)要在wait(mutex)之前,在消费者进程中wait(full)要在wait(mutex)之前?这个视频中有说,可不可以用自己的语言描述一下
1.生产者先执行,1)有放产品的位置 2)无位置
2.消费者先执行,1)有产品可取 2)无产品可取
对生产者而言,如果wait(mutex)在前,那么表示生产者在放置产品时,首先查看仓库是否有人占用,若有人占用则等待;若无人占用,则使用仓库然后在查看仓库中有没有空的栅格,若有则放置产品,之后走人(释放相关信号量:full+1,mutex+1),不产生任何问题,但是如果没有空的栅格则等待,此时就出现问题了:任何生产者和消费者都不能进入仓库,因为仓库正被刚才那个生产者占用(他在放下他的产品之前是不可能退出仓库的,而消费者这个时候又无法进去仓库,因此不能出现空的栅格使得生产者放下他的产品),任何进程都无法推进(死锁)
消费者进程中如果wait(mutex)在前,同样道理,请大家自行分析。
有注意到生产者和消费者分别用了一个互斥信号量吗
其实这已经保证不存在刚才的问题
只要分别处理对in和out的互斥使用就好了,同不同时进入仓库不是问题
哪怕大家一窝蜂都在仓库里面都行
只有一个人in,只有一个人out,也就是说任何时刻顶多一人在放产品一人在取产品 -
哲学家进餐问题中的5支筷子是什么样的共享资源,互斥?同步?有几种方式可以避免哲学家进餐问题的死锁发生
每支筷子都是互斥访问的共享资源,因此每支筷子设置一个互斥信号量,初始值为1。
解决死锁的方法(每一种方法都要掌握,包括程序代码):
1)任何人要吃饭必须同时拿起左右的筷子(只要有一支筷子被使用,则等待)——用AND记录型信号量实现
2)给哲学家编号,奇数编号的哲学家吃饭先取左边的筷子,偶数编号的哲学家吃饭先取右边的筷子(或者交换一下左右也行)
3)最多允许4人同时吃饭——引入计数(初始值为4的信号量,当然也可以最多允许3人同时吃饭…,但显然不能允许5人同时吃饭);这种做法可以用5台计算机共享使用4台打印机的问题来理解。