基础概念
进程同步机制的主要任务
:是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。临界资源
:诸进程间应采取互斥方式,实现对这种资源的共享。临界区
:人们把在每个进程中访问临界资源的那段代码称为临界区。同步机制都应遵循下述四条准则
:①空闲让进。②忙则等待。③有限等待。④让权等待。信号量(S)
:拥有的资源总数。P操作(wait)
:申请临界资源。【有,资源数减一。无,阻塞调用进程。】V操作(signal)
:释放资源。【资源数量加一。唤醒等待进程。】- 通过PV操作,S为正值,表示当前剩余的资源数量。S为负值,它的绝对值表示当前等待唤醒的进程数。
具体例题
解题的基本思路:
(1)首先分析是什么类型的问题:纯互斥、纯同步、同步+互斥
(2)同步+互斥题:先做同步,后做互斥
(3)分析存在几个运行主体
(4)站在每个运行主体的角度思考:它需要申请什么资源(条件)、释放什么资源(结果)
(5)分析同步信号量的初值
(6)再做互斥/纯互斥题:找到临界区(临界资源),完成互斥
- 生产者-消费者问题: 有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。请利用信号量来解决该问题。
分析:
(1)缓冲池:临界资源(互斥),不能同时使用缓冲区
(3)定义信号量:semaphore mutex=1(互斥信号量)full=0(初始状态下,缓冲区为空)empty=n(初始状态下,空缓冲区数量为n)
full+empty=n
semaphore mutex=1,full=0,empty=n;
生产者{
while(1){
//先同步,后互斥
P(empty);//是否还要空缓冲区
P(mutex);
...
V(metex);
V(full);//缓冲区+1
}
}
消费者{
while(1){
P(full);//检测生产者是否生成了产品
P(mutex);
...
V(mutex);
V(empty);//空缓冲区加一
}
}
- 桌上有个能盛得下五个水果的空盘子。爸爸不停地向盘中放苹果或桔子,儿子不停地从盘中取出桔子吃,女儿不停地从盘中取出苹果吃。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步。
分析:盘子为临界资源
semaphore orange=0,apple=0,empty=5,mutex=1;
爸爸{
while(1){
P(empty);
P(mutex);
if(放苹果){
V(apple);//苹果+1
}
if(放桔子){
V(orange);//桔子+1
}
V(mutex);
}
}
儿子{
while(1){
P(orange);
P(mutex);
从盘子中拿了一个桔子;
V(mutex);
V(empty);
}
}
女儿{
while(1){
P(apple);
P(mutex);
从盘子中拿了一个苹果;
V(mutex);
V(empty);
}
}
- 哲学家进餐问题。
分析:
- 放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。
- 5位哲学家同时进餐的话,会发生死锁,为了防止死锁的发生:最多允许4位哲学家同时坐在桌子周围,定义一个信号量room=4。
semaphore mutex[4]=1,room=4
第i位哲学家(i∈[0,4]){
while(1){
思考;
P(room);
P(mutex[i]);//取第i根筷子
P(mutex[(i+1)mod5]);//取相邻的筷子
进餐;
V(mutex[i]);//放下第i根筷子
V(mutex[(i+1)mod5]);//放下相邻的筷子
V(room);//离开桌子
}
}
- 设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售者销售;销售者每次循环从仓库中取出一个产品进行销售。不允许同时入库,也不允许边入库边出库;而且要求生产A产品和B产品的件数满足以下关系:-n<=A的件数-B的件数<=m,其中n、m是正整数,但对仓库中A产品和B产品的件数无上述要求。请用信号量机制写出A、B、C三个进程的工作流程。
- 某寺庙有小和尚,老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个,每次入缸取水仅为1桶水,且不可同时进行。试给出有关从缸取水、入水的算法描述。