第0题-信号量的工作机制
考试时PV有两种
第一种,虽然也是资源,但这种PV用来上锁,A这个事情不想被其他进程打扰,那么就前面P一下后面V一下,也就是上锁mutex
互斥
第二种,在做B这件事情前必须有A这个资源
同步
其实还有一种计数问题,count
第1题-wait和signal的同步
(1)因为信号量S 是能够被多个进程共享的变量,多个进程都可以通过wait()和signal() 对S 进行读、写操作
(2)1不正确,在wait()中,当s<=0时,关中断后,其他进程无法修改s的值,while语句陷入死循环。方法2是正确的
(3)不能,因为开/关中断指令都是特权指令,不能在用户态下执行,只能在内核态下执行
第2题-生产者消费者问题1
这类问题的典型特征就是一个人要和另一个人相互配合,B需要A提供的,A也需要B提供的
缓冲区一般要互斥,这里有一个互斥关系
“缓冲区大小”、“产品数量上限”,“多少个东西“,一般见到这种数量,都需要声明两个变量,信号量empty、full
对于生产者来说,empty也是一种资源,它需要申请empty才能放
而消费者需要full这种资源
对于缓冲区这个临界资源的互斥关系,必须“夹最紧的地方”,能夹最少就夹最少。否则死锁
如果缓冲区大小为1,可以写更简略。empty为1时,empty只有1个因此当一个生产者P的时候其他生产者P不了,且empty为1的时候full肯定是0,因此临界区最多只会有一个人,所以不需要mutex了。full为1也同理。
第3题-生产消费2
看每个人需要什么和提供什么
需要什么就是P什么
这道题缓冲区大小也是1,所以不需要mutex了
第4题-复杂的生产消费者
(1)empty是信号量,也就是一种资源,因此可以是负的,所以最小不是0
(2)原先mutex不仅防止消费者也防止生产者,现在不需要防生产者了,所以用不同的变量即可
(3)限制条件是限制消费者而不是生产者
第5题-读者写者1
(2)
count表示里面有没有读者,如果没有则需要和写者竞争,如果有直接进去读就可以了。第一个人开门,最后一个人关门
if会导致两个人同时满足条件,所以要有一个锁把这个判断给锁上,这个锁只是用来防止其他读者的
但这样有一个问题,只要里面有读者,排在后面的读者可以直接插写者的队,因此这是读者优先的
第6题-读者写者2
要读写公平,只需要再创建一个公平队列,先排这个公平队列,出来后才可以排之前那个不公平的队列
写者的V(w)应该不止一处可以放
但注意读者还是要能同时读这一条件的,因此读者中V(w)在读文件前
第7题-写者优先
把那个公平的队列w改成写者可以插队的队列即可
第8题-双读者问题
第9题-流程问题
第10题-流程问题2
T1中
signal(E);然后紧接着wait(E);因此这两个直接抵消了
第11题-流程3
第12题-流程4
1给2的平衡木虽然足够多,但由于2需要拿到这个才能过河,因此平衡木也是一个信号量
独木桥也是信号量
而船不是信号量
还有一个可写可不写的信号量,就是1要等2过河,因此P(过河)
第13题-哲学家问题
死锁版:
改进1:
不让5个人同时拿,比如规定最多同时有四个人拿。
因此将“拿筷子”这件事情也看成一种资源
改进2:
锁桌子
就是自己拿的时候不允许其他人拿
改进3:改变拿筷子顺序,使12为竞争对手,34为竞争对手,还剩下一些筷子
第14题-408真题哲学家2
思考如果m大于等于n,谁都可以拿到;只有小于n的时候才有用
注意它这里说“为使尽可能多的哲学家同时就餐”,就是说上一题的那个锁桌子方法行不通
如果m小于n,应该要先拿碗。且这个时候拿到碗就相当于上一题中有吃饭的资格,因为碗的数量小于等于n-1了,就是限制了能拿筷子的人数
因此m大于等于n的时候,是n-1
第15题-读程序
在看两个程序是否同步异步时,就是要看它们的共享变量
这里只有x是共用的,因此看对x的操作
比如不同的顺序267和2167的结果是不一样的,因此不能并发执行
改正:因此只需要保护x不受并发影响即可
第16题-有点难的王道课后题
同步应该在互斥前面
涉及到产品数量,因此用两个count,
用到计数变量,就要对技术变量保护
这里既用到acount也用到bcount,就要对a、b全部隔绝
如果是上面这样的话,可能会满足mutex2却不满足mutex,然后死锁
其实这里只需要mutex2即可,有了mutex2就不需要mutex了,已经保证了只有自己霸占仓库
答案的写法:
设定一个信号量表示放a的机会(一种资源)和放b的机会有多少个
一开始A最多能放m-1个,B最多能放n-1个
放一个b就增加一个放a的机会
n<信<m
设置初值为n,此时放信的机会有m-n个,取信的机会0个
第17题-面包师
第18题-装配问题
第19题-和尚打水
注意老和尚喝水也要用水桶
第20题-输入输出问题