生产者与消费者问题.docx
《生产者与消费者问题.docx》由会员分享,可在线阅读,更多相关《生产者与消费者问题.docx(8页珍藏版)》请在冰豆网上搜索。
生产者与消费者问题
形象启发分层解剖
——PV操作教学引导实践
【摘要】PV操作及利用PV原语实现进程间的同步互斥是计算机操作系统中一个非常重要的学习内容。
本文详细介绍了形象启发,分层解剖的教学方法在教学中的应用,希望以此引出更优的教学方法。
【关键词】PV操作、形象启发、分层解剖、生产消费者问题、多媒体课件
PV操作及同步互斥的实现是操作系统这门课中最抽象,也是学生难以理解的知识内容之一,其中生产消费者问题又是PV操作中最为经典的案例,学生要深刻理解这个知识点并不容易。
为了取得较好的教学效果,帮助学生深刻理解这个知识点,本人制作了多媒体课件《PV操作及实现同步互斥》,把抽象的内容具体化,由浅到深,化解难点,通过形象启发,分层解剖的科学教学方法,提高了学生学习积极性,在教学实践中取得非常显著的效果。
一、明确定义
要理解生产消费者问题,首先应弄清PV操作的含义:
PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S):
①将信号量S的值减1,即S=S1;
②如果S0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):
①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
这只是书本的定义,对于这部分内容,老师先不要急于解释上面的程序流程,而是应该让学生首先知道P操作与V操作到底有什么作用。
P操作相当于申请资源,而V操作相当于释放资源。
所以要学生记住以下几个关键字:
P操作-----申请资源
V操作----释放资源
二、形象启发
为此举两个生活中的例子:
例一:
在公共电话厅打电话
公共电话厅里有多个电话,如某人要打电话,首先要进行申请,看是否有电话空闲,若有,则可以使用电话,如果电话亭里所有电话都有人正在使用,那后来的人只有排队等候。
当某人用完电话后,则有空电话腾出,正在排队的第一个人就可以使用电话。
这就相当于PV操作:
某人要打电话,首先要进行申请,相当于执行一次P操作,申请一个可用资源(电话);
某人用完电话,则有空电话腾出,相当于执行一次V操作,释放一个可用资源(电话)。
在多媒体课件中,这部分内容充分通过动画效果,演示整个申请电话资源(P操作)与释放电话资源(V操作)的过程,同时显示当前可用的资源个数(电话个数)。
课件直观生动,一目了然,学生非常容易接受,并且理解深刻。
例二:
上厕所
不知为什么,只要我讲到这个例子,学生总是情不自禁地笑起来,课堂气氛活跃起来。
这反而更好,学生兴趣提起来,自然就认真听。
某人要上卫生间,首先要看是否有空位;若某人使用完毕后;则释放一个空卫生间可使用。
若要使用的人数多于卫生间的个数,那只好排队等待。
这也相当于PV操作:
某人要使用卫生间,首先要进行申请,相当于执行一次P操作,申请一个可用资源(卫生间);
某人用完卫生间,则有卫生间腾出,相当于执行一次V操作,释放一个可用资源(卫生间)。
通过这两个生活的例子,学生很快就掌握了PV操作的主要含义,现在再具体讲解PV操作的每一个步骤,自然就水到渠成了。
三、分层解剖
在理解了PV操作的的含义后,就必须同学生讲解利用PV操作可以实现进程的两种情况:
互斥和同步。
根据互斥和同步不同的特点,就有利用PV操作实现互斥与同步相对固定的结构模式。
这里就不详细讲解了。
但生产者-消费者问题是一个有代表性的进程同步问题,要学生透彻理解并不容易。
但是如果我们将问题细分成三种情况进行讲解,理解难度将大大降低。
(1)一个生产者,一个消费者,公用一个缓冲区。
可以作以下比喻:
将一个生产者比喻为一个生产厂家,如伊利牛奶厂家,而一个消费者,比喻是学生小明,而一个缓冲区则比喻成一间好又多。
第一种情况,可以理解成伊利牛奶生产厂家生产一盒牛奶,把它放在好又多一分店进行销售,而小明则可以从那里买到这盒牛奶。
只有当厂家把牛奶放在商店里面后,小明才可以从商店里买到牛奶。
所以很明显这是最简单的同步问题。
图解如下所示:
解题如下:
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为1。
full——表示缓冲区中是否为满,初值为0。
生产者进程
while(TRUE){
生产一个产品;
P(empty);
产品送往Buffer;
V(full);
}
(2)一个生产者,一个消费者,公用n个环形缓冲区。
第二种情况可以理解为伊利牛奶生产厂家可以生产好多牛奶,并将它们放在多个好又多分店进行销售,而小明可以从任一间好又多分店中购买到牛奶。
同样,只有当厂家把牛奶放在某一分店里,小明才可以从这间分店中买到牛奶。
不同于第一种情况的是,第二种情况有N个分店(即N个缓冲区形成一个环形缓冲区),所以要利用指针,要求厂家必须按一定的顺序将商品依次放到每一个分店中。
缓冲区的指向则通过模运算得到。
解题如下:
定义两个同步信号量:
empty——表示缓冲区是否为空,初值为n。
full——表示缓冲区中是否为满,初值为0。
设缓冲区的编号为1~n1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。
生产者进程
while(TRUE){
生产一个产品;
P(empty);
产品送往buffer(in);
in=(in+1)modn;
V(full);
}
(3)一组生产者,一组消费者,公用n个环形缓冲区
第三种情况,可以理解成有多间牛奶生产厂家,如蒙牛,达能,光明等,消费者也不只小明一人,有许许多多消费者。
不同的牛奶生产厂家生产的商品可以放在不同的好又多分店中销售,而不同的消费者可以去不同的分店中购买。
当某一分店已放满某个厂家的商品时,下一个厂家只能把商品放在下一间分店。
所以在这种情况中,生产者与消费者存在同步关系,而且各个生产者之间、各个消费者之间存在互斥关系,他们必须互斥地访问缓冲区。
图解如下:
解题如下:
定义四个信号量:
empty——表示缓冲区是否为空,初值为n。
full——表示缓冲区中是否为满,初值为0。
mutex1——生产者之间的互斥信号量,初值为1。
mutex2——消费者之间的互斥信号量,初值为1。
设缓冲区的编号为1~n1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。
生产者进程
while(TRUE){
生产一个产品;
P(empty);
P(mutex1);
产品送往buffer(in);
in=(in+1)modn;
V(mutex1);
V(full);
}
四.结束语
将一个复杂的问题解剖成三个问题讲解,由浅到深,层层深入,逐步扩展,并联系生活中的例子,这样一来,学生很快就掌握了这部分的内容。
在多媒体课件中,这部分内容全部通过动画程序进行演示,学生还可以亲自动手进行操作,观察整个动画的运行过程。
另外,利用PV操作实现进程的同步互斥,对程序中的语句执行顺序要求非常高,所以在课件中配有相关的练习,并通过交互的操作方式,让学生在练习中加深理解,提高了学习效率,教学效果也非常显著。
参考文献:
1.《操作系统教程》,曾平 郑鹏 金晶,清华大学出版社
2.《尝试教学论》,邱学毕,教育科学出版社
3.《操作系统》,中央人民广播电视大学出版社
.