用P、V原语实现进程互斥与同步;生产者-消费者问题
一、互斥原理
一次仅允许一个进程使用的资源称为临界资源。
每个进程中访问临界资源的那段程序称为临界区。
进程进入临界区的调度原则是:
①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
④如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现“忙等”现象。
设信号量sem是用于互斥的信号量,且其初值为1表示没有并发进程使用该临界区。
只要把临界区置于P(sem)和V(sem)之间,即可实现进程间的互斥。
当一个进程想要进入临界区时,它必须先执行P原语操作以将信号量sem减1。
在一个进程完成对临界区的操作之后,它必须执行V原语操作以释放它所占用的临界区。
由于信号量初始值为1,所以,任一进程在执行P原语操作之后将sem的值变为0,表示该进程可以进入临界区。
在该进程未执行V原语操作之前如有另一进程想进入临界区的话,它也应先执行P原语操作,从而使sem的值变为-1,因此,第二个进程将被阻塞。直到第一个进程执行V原语操作之后,sem的值变为0,从而可唤醒第二个进程进入就绪队列,经调度后再进入临界区。在第二个进程执行完V原语操作之后,如果没有其他进程申请进入临界区的话,则sem又恢复到初始值。
二、互斥过程描述
用信号量实现两个并发进程PA和PB互斥的描述如下:
(1)设sem为互斥信号量,其取值范围为(1,0,-1)。其中sem=1表示进程PA和PB,都未进入类名为S的临界区,sem=0表示进程PA或PB已进入类名为S的临界区,sem=-1表示进程PA和PB中,一个进程已进入临界区,而另一个进程等待进入临界区。
(2)实现过程描述如下:
三、同步原理及过程
四、生产者-消费者问题
五、例题
(一)四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F,但限制是进程A和进程C不能同时读文件F,进程B和进程D不能同时读文件F,为了使这四个进程并发执行能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
(1)应定义的信号量及初值;
(2)在下列程序中填上适当的PV操作,以保证它们能正确并发工作;
解:(1)定义二个信号量S1、S2,初值均为1,即:S1=1,S2=1。其中进程A和C使用信号量S1,进程B和D使用信号量S2。
(2)从1到8分别为:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)
(二)有一只铁笼子,每次只能放一只动物,猎手向笼子中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店取笼中的猪,试用PV操作写出同步执行的程序。
解:信号量设置:empty,pig,tiger; empty=1: 笼子的空位,笼子中只能放一个动物;pig=0: 笼子中猪的个数;tiger=0: 笼子中老虎的个数;
(三)有三个进程PA、PB和PC合作解决文件打印问题:PA将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录的大小。请用P、V操作来保证文件的正确打印。(提示:这是一个Producer—Consumer问题)
解:设置四个信号量empty1,、empty2、full1、 full2,信号量empty1和empty2分别表示缓冲池1和缓冲池2是否为空,其初值均为1;信号量full1和full2分别表示缓冲池1和缓冲池2是否有记录供读出,其初值均为0。
(四)有一个仓库,可以存放A和B两种产品,但要求:
(1)每次只能存入一种产品(A或B);
(2)-N < A产品数量 - B产品数量 < M.
其中,N和M是正整数。试用P、V操作描述产品A和B的入库过程。
解:
信号量设置:mutex, sa, sb;
mutex=1: 对仓库互斥操作 mutex n. 互斥
sa= M-1: 当前还允许A入库的数量
sb= N-1: 当前还允许B入库的数量
main()
{
cobegin
provider_A();
provider_B();
coend
}
provider_A()
{
while(true)
{
p(sa); //取一个A产品准备入库
p(mutex);
放入零件A;
v(mutex)
v(sb); //还能存入B产品数量+1
}
}
provider_B()
{
while(true)
{
p(sb);
p(mutex);
放入零件B;
v(mutex)
v(sa);
}
}
(五)填空题:在生产者-消费者问题中,各生产者进程使用的过程deposit(data)和各消费者使用的过程remove(data)可描述如下:
(备注:信号量avail表示有界缓冲区中的空单元数,初值为n;信号量full表示有界缓冲区中非空单元数,初值为0。信号量mutex表示可用有界缓冲区的个数,初值为 1)。
deposit(data):
begin
P(avail)
P(mutex)
————————
V(full)
V(mutex)
end
remove(data):
begin
P(full)
P(mutex)
————————
V(avail)
V(mutex)
end
答:1、送数据入缓冲区某单元 2、取缓冲区中某单元数据
(六)请试填空,用P、V 操作实现进程A和进程B之间的互斥关系,S=1,注:互斥信号量以称为公用信号量,其初值为1。
1、A进程进入临界区
2、B进程进入临界区