基于实例的进程同步教学模型的研究与构建
2016-11-11王举辉谢印宝张艳华
王举辉++谢印宝++张艳华
摘 要: 本文针对操作系统教学中的重点和难点——进程同步的学习,提出一个完整的进程同步教学模型。首先通过生活中的例子理解概念;其次通过游戏理解进程同步机制;最后通过教学模型实现进程同步的应用。通过在实际中的应用,该解决进程同步问题的思路和模型证明是有效的。
关键词: 进程同步 共享资源 相互合作 教学模型 P、V操作
操作系统是计算机系统中的核心软件之一,现代计算机离不开操作系统。操作系统课程是计算机应用人员深入了解和使用计算机的必备知识,是进行系统软件开发的理论基础,也是计算机科学与技术专业的一门理论性较强的主干课程,很多学校都将该门课程作为重点课程建设。因此,提高该门课程的教学质量对于培养合格的计算机专业人员是至关重要的,如何学好操作系统是每个教师学生所关心的。
长期以来,许多院校的师生都反映操作系统的课程看起来比较容易,但在学习过程中感觉枯燥、难讲、难学,尤其是进程同步方面的知识,是整个操作系统教学中的重点和难点,往往学完整个操作系统课程还是不理解、不会解决进程同步问题。很多教师在这方面都进行了探索。牛欣源[1]为进程同步问题构建了一个较通用的设计实现模型,主要分为三个方面:(1)分析独占资源的资源管理,利用信号量及其P、V操作实现资源管理;(2)利用资源管理基本方式,构建能够描述同步、互斥问题的模型;(3)应用该模型,解决经典同步案例。王文磊等[2]讨论了经典进程同步问题的研究与实现,并实现了多线程下的进程同步。笔者根据自身及整个教学团队多年的教学、教改经验,提出了一整套利用信号量机制解决进程同步问题的思路、模型,为教师提供了便利,减轻了初学者的负担。
一、通过生活实例理解进程同步的概念
在解决进程同步问题之前,首先要明确一个概念:进程同步。汤小丹[3]等在《计算机操作系统(第三版)》关于进程同步的描述:进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。从以上定义可以看出,进程同步解决的是进程间的执行次序问题,目的是使各进程能有效地共享资源和相互合作。衍伸看,进程同步问题中存在两类问题:同步和互斥。同步是由于相互合作而产生的,互斥是因为共享资源而产生的。解决了同步和互斥,就解决了进程同步问题。
但是,由于操作系统本身的抽象性,学生理解同步和互斥并不是一件容易的事情,尤其是同步。将抽象变为具体,理解起来就容易得多。在实际教学中,我们会将现实生活中与学生关系密切的事件作为例子,帮助大家理解概念。对于同步,由于体现的是相互合作进程之间的关系,可以运动会中的接力比赛为例,第一棒的学生发令枪一响,按照各自的速度向前奔跑,而第二棒的学生也想早点跑,但没有接到棒之前,只能等待,只要接到棒,就可以按照自己的速度想跑多快就跑多快。在这个过程中既体现了相互合作学生(进程)之间的次序问题,又体现了进程的异步性。同步的提出就是为了解决进程执行过程中的异步性。第二棒的学生不管跑多快,他受到第一个学生的制约,即直接制约关系。同步进程的执行是有固定次序的,必须区分先后。不管什么时间执行,都必须按照既定的次序。
对于互斥,是由于共享资源而产生的,相对说好理解。但为了后面进程同步的应用,也可以举个实例。例如,学生宿舍共用水龙头的问题。水龙头属于临界资源,一段时间只允许一个同学(进程)访问。但是,对水龙头的使用是没有固定次序的,只要保证一段时间内只有一个同学(进程)使用就可以。在某个同学使用的过程中,其他同学可以SLEEP(或BLOCK)(同步进制中的忙则等待),不需要不断地看别人用完了没有,等别人用完可以将他WAKEUP。而且,当一个人用完后要让给别人,不能锁起来(同步机制中的空闲让进)。使用水龙头的学生尽量快,不要等到上课了还有学生没洗(同步进制中的有限等待)。如果一个同学在洗的过程中被人叫走,那么水龙头要让给别人。(同步机制中的让权等待)。这个例子因为非常贴近生活,学生可以在生活中注意观察、体会,以加深对互斥和进程同步的理解。
通过上面的与同学关系密切的生活片段,可以让学生更深刻地理解进程同步,同时理解相关的概念。最后总结:互斥是一种特殊的同步,虽没有固定的执行次序,但一旦某个进程使用临界资源,其他进程必须等待。同步是有固定次序的。
二、通过游戏理解进程同步机制
这里仍然以经典的进程同步机制—信号量机制讲起。
信号量本身不难理解,我们可以将它与生活中的红绿灯(信号灯)联系起来,红灯停,绿灯行。但是,在应用信号量的过程中,许多学生还是难以理解进程同步中的停和行是怎么回事,是如何控制的。枯燥的讲解不如做游戏掌握得快。为此,我们设计了一个课堂游戏帮助大家理解信号量的应用,以体验进程执行中的“停”和“行”。
游戏设置:(1)放苹果和取苹果的同学各一组,每组各三人(相当于两组进程);(2)两个空盒子,每个只能放一个苹果(相当于临界资源,可以认为是包含多个缓冲区的缓冲池);(3)一个S,用于取放苹果的同学互斥访问盒子,两个S1,用于控制放苹果的,两个S2,用于控制取苹果的;(4)初始状态:两个S1放在放苹果的一方的桌子上,两个S2放在盒子里,S放在另一张桌子上。
规则:(1)放苹果的学生必须先拿到一张S1后再去拿S,两张都拿到才能放苹果,其中任何一张拿不到都需要等(阻塞);(2)取苹果的学生必须先拿到一张S2再去拿S,两张都拿到才能取苹果,其中任何一张拿不到都需要等(阻塞);(3)放苹果的学生每次放完苹果将S1放到相应的盒子上,并将S放回原处,同时将该盒子上原有的S2放到取苹果的同学一端;(4)取苹果的学生每次取完苹果将S2放到相应的盒子上,并将S放回原处,同时将该盒子上原有的S1放到放苹果的同学一端;(5)在取放苹果的过程中,每个学生按照自己的速度向前行(体现并发进程的异步性)。
在这个游戏中,必须先放苹果才能取苹果(可以取苹果的S2初始放在盒子里),体现了进程之间的合作(同步);对盒子的访问必须先拿到S,一段时间只有一个学生能拿到,体现了对临界资源的互斥访问。另外,在游戏中还体现出当同步信号量和互斥信号量同时出现时,要先同步(先拿S1),后互斥(再拿S),以免死锁。
通过上述游戏,学生很容易理解信号量的使用,并进一步理解了进程的同步和互斥。该游戏可以多玩几次,每次完成后作为奖励将苹果送给参与的学生。
三、通过进程同步模型解决进程同步的应用
通过前面的讲解,同学们对进程同步的相关概念已经有了深入的了解,但是实际应用起来还是觉着无从下手。为此我们在实践的基础上建立了一个利用信号量机制解决进程同步问题的模型,通过这个模型,学生可以比较容易地实现进程同步的应用,对初学者有帮助。具体模型包括:
(一)描述进程的执行过程。
这一步比较简单,可以用自然语言描述,也可以用伪代码描述。
(二)分析进程间的相关性。
进程同步所关注的是相关进程间的执行次序问题,进程间没有关系的动作,或者说属于进程自己的行为,不需要加以协调。同时,分析进程间哪些动作具有相关性,也是后面分析进程间存在哪些制约关系及将P、V操作放到合适位置的基础。
(三)分析相关进程存在的关系,定义信号量。
这一步需要分析相关进程之间存在的关系,根据关系定义信号量并给出信号量的初值。
1.分析进程间的关系。相关进程之间存在着两种关系:因相互合作而产生的直接制约关系和因共享资源而产生的间接制约关系。直接制约即同步,间接制约即互斥。那么,在具体的问题中,我们就从这两种关系入手,看看问题中到底存在着相互合作还是共享资源,或者二者兼有。判断相关进程之间是否存在着共享资源相对比较简单,也比较明显。只要这类资源是进程竞争的对象,就是共享资源,例如同宿舍同学对水龙头的竞争。
对于因相互合作而产生的直接制约关系,即同步,各进程之间一定存在着固定的执行次序,可分为两种情况。一种为简单的同步,即进程中的相关动作之间只存在简单的先后次序关系,可以通过前驱图来描述,谁在前驱位置,谁在后继位置一目了然。例如运动会中的接力赛。第二种为较复杂的同步,各进程间相关动作彼此影响,互相制约。这一过程通常是循环的过程。例如取放苹果的过程,取苹果受放苹果的制约,放苹果受取苹果的制约。
2.定义信号量。根据上述分析,对于因共享资源而产生的互斥,有几类资源就设置几个相应的信号量;对于因相互合作而产生的同步,对应在前驱图中,存在几对前驱关系,就设置几个信号量;对于比较复杂的前驱关系,除了上面设置的信号量之外,还要考虑处于前驱位置的动作的执行条件,即设置相应的信号量控制前驱位置的执行。需要注意的是,设置信号量时要明确指出信号量的物理含义。
3.定义信号量的初值。初值即信号量在问题中的初始状态的值,这里问题的初始状态是关键。信号量的初值可分为三类:1,0,n。1代表临界资源,0表示简单的前后次序,n表示需要n个这类的资源。如果是临界资源,初值为1,但如果问题中有多个同样的临界资源,初值即为相应的个数,例如三个打印机,信号量的初值即为3。如果问题中是描述简单的前驱关系(相互合作)的,信号量初值固定为0;对于复杂的前驱关系,控制前驱动作执行的信号量初值通常为资源的数量。
(四)将P、V操作放在合适的位置。
这是信号量的应用中较难的一个步骤,尤其是P操作的位置,如果不当,或者不能实现相互合作进程之间的同步或对临界资源的互斥访问,更严重的会造成死锁。
需要注意的是,P、V操作必须成对出现,有一个P操作就有一个V操作。当进程中涉及多个P操作的时候,要注意执行顺序。若同时出现关于同步的P操作和关于互斥的P操作,则同步P操作放在互斥P操作之前前面;执行V操作虽然不会造成死锁,在进程中的两个V操作的位置一般不需特别注意,但V操作的顺序可能会延迟进程的推进,因此在使用完互斥信号量后要及时执行相应的V操作。关于同步的P、V操作要放在不同的进程中,关于互斥的P、V操作要放在同一进程中。
对于互斥,只要在每个进程中访问临界资源之前加上相应的P操作即可,访问完加上相应的V操作;对于同步,由于可以用前驱图表示,那么在前驱图中后继位置的语句之前加上相应的P操作,而在前驱位置的语句之后加上V操作。
简单来说,进程中想控制哪条(或哪几条)语句就在之前加上P操作。这里的控制包括互斥进程对共享资源的访问控制及合作进程对执行的先后次序的控制。当一个进程中某个动作要执行的时候,只要需要判断能不能执行,就在之前加上P操作,由P操作帮助进程判断。
四、总结与展望
本文主要介绍了操作系统中课程中的一个重点和难点—进程同步的学习思路和解决问题的模型,学生使用该模型后,对相关概念的理解更深刻,利用信号量机制解决进程同步问题也有章可循。因为进程同步问题比较难懂,即使概念理解了应用起来也觉得较难,所以在介绍的过程中除了按上述步骤进行外,还可将该模型应用于现实生活中比较有趣或很贴近生活的例子。这样,学生在理解和掌握操作系统原理中的一些重要而抽象的概念和难点问题时就变得容易,也增加学习的乐趣。当然,进程同步毕竟是个难点,需要多做练习,在练习的过程中进一步升华。这种基于实例的教学方法可推广到操作系统的其他知识的学习中。
参考文献:
[1]牛欣源.进程同步的资源管理模型构建与应用[J].计算机技术与发展,2010(6).
[2]王文磊,徐汀荣.经典进程同步问题的研究与实现[J].计算机工程与设计,2006(12).
[3]汤小丹,梁红兵,哲凤屏,等.计算机操作系统(第三版)[M].西安:西安电子科技大学出版社,2007:5.