基于信号量的进程同步与互斥(3)
1. 吸烟者问题
涉及代理人和三个吸烟者。 吸烟者永远地循环,首先等待配料,然后制作和吸烟。配料的成分是烟草,纸和火柴。我们假设代理商拥有无限供应的所有三种成分,每个吸烟者都有无限供应的其中一种成分; 也就是说,一个吸烟者有火柴,另一个有纸,第三个有烟草。代理商反复随机地选择两种不同的成分,并使其可供吸烟者使用。根据选择的成分,具有补充成分(剩下那种成分)的吸烟者应该拿走这两种资源并继续处理(制作和抽烟)。例如,如果代理商拿出烟草和纸张,那么拥有火柴的吸烟者应该拿起两种成分,制作香烟,然后发出信号给代理商。
可以理解为代理商是分配资源的操作系统,吸烟者是需要资源的应用程序,要确保:如果资源可用,允许再多执行一个应用程序;相反如果应用程序无法继续,需要避免唤醒它。另外,需要添加限制,不能修改代理代码,如果代理表示操作系统,不希望每次新应用程序出现时都修改代理。
信号量:
agentSem = Semaphore(1)
tobacco = Semaphore(0)
paper = Semaphore(0)
match = Semaphore(0)
代理商需要三个并发线程,分别代表提供其最终的两种配料。
Agent A: //提供烟草和纸的代理商
while true:
P(agentSem)
V(tobacco)
V(paper)
Agent B: //提供纸和火柴的代理商
while true:
P(agentSem)
V(paper)
V(match)
Agent C: //提供火柴和烟草的代理商
while true:
P(agentSem)
V(match)
V(tobacco)
需要引入三个Pusher的辅助线程和附加变量和信号量,比如isTobacco表示烟草是否已经供应,tobaccoSem实现Pusher和Smokers with tobacco的同步,也就是去唤醒只有tobacco的吸烟者,其他同理。
isTobacco = isPaper = isMatch = False
tobaccoSem = Semaphore(0)
paperSem = Semaphore(0)
matchSem = Semaphore(0)
Pusher A:
while true:
P(tobacco)
P(mutex)
if isPaper:
isPaper = False
V(matchSem)
elif isMatch:
isMatch = Flase
V(paperSem)
else:
isTobacco = True
V(mutex)
Pusher B:
while true:
P(paper)
P(mut

本文深入探讨了基于信号量的进程同步与互斥原理,通过分析吸烟者问题、理发师问题、圣诞老人问题等经典案例,揭示了如何利用信号量解决资源分配、互斥访问等问题。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



