基于信号量的进程同步与互斥(3)

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

基于信号量的进程同步与互斥(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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值