操作系统课程实验中的五重奏哲学
2009-01-18邹恒明
摘要:作为计算机专业的核心课程,操作系统的教学效果一直不甚理想。造成此种状况的原因很多,本文针对其中的一个环节——操作系统的课程实验——进行讨论。在分析当前课程实验中存在的问题后,本文提出将操作系统实验分为了解操作系统、使用操作系统、操作系统编程、操作系统改进、操作系统设计五个层次进行设计。这五个层次上的实验可以根据学校不同和学生素质与能力不同或单独或组合使用,形成一种高低搭配、错落有致的操作系统实验的五重奏。
关键词:操作系统;实验设计;五重奏哲学
中图分类号:G642 文献标识码:B
1引言
作为计算机专业的一门核心课程,操作系统的教学效果一直不甚理想。通过对相关学生的调查发现,绝大多数学生对操作系统的理解存在错位和误区,概念上模糊,对操作系统的各种机制缺乏逻辑性的理解。就以内核态和用户态为例,学生对如下几个问题的理解存在相当大的疑惑:驱动内核态和用户态的根本力量是什么?这两种态势在实现上的区别是什么?什么样的功能需要在内核态或用户态进行?程序如何从一个态势切换到另一个态势?这种切换隐含着什么样的重大意义?
显然,操作系统本身的复杂性是导致教学效果不佳的一个原因;另外,操作系统教学机制上存在的诸多问题,如教学方法老旧、教材选择偏差、讲课方式枯燥等,也是另一个原因——这些问题我已在《操作系统之哲学原理》(《计算机教育》2009年第17期)一文中进行了讨论。本文要讨论的是另一个对操作系统教学有着重大影响的因素:课程实验设计,因为操作系统课程实验上存在的缺陷与当前令人沮丧的教学效果有着直接的关系。
由于操作系统的实验性质很强,不亲自动手做与操作系统有关的实验,对操作系统的了解就势必流于肤浅,因此操作系统课程通常都伴有实验。但我们通过多年的教学实践与调查发现,操作系统的实验设计存在诸多问题,大部分上过操作系统课程的学生确实做过操作系统实验,但已经忘记实验的具体过程,也不理解这些实验的背后动机,以至于学生做完实验后对操作系统的理解并没有得到多大的提升,或提升的程度相当有限。
2当前操作系统实验设计面临的问题
虽然不同的学校在操作系统实验设计上有自己的特点,但由于操作系统的复杂性和外来性(即操作系统终究是一个由外国人发明和完善的东西),各个学校在课程实验设计上也存在着一些共同的缺陷。根据我们的调查,这些共同点缺陷包括目标模糊、缺乏层次、生搬照用和没有趣味。
2.1目标模糊
设计实验的时候并没有考虑到学生的培养目标是什么。是培养会使用操作系统的人,还是会进行底层编程的人,还是将来开发设计操作系统的人?对于不同的目标,操作系统实验设计就应该有所不同。如果不考虑这个因素,实验设计的时候就没有针对性,学生就会觉得实验对他们的未来事业没有帮助或帮助有限。当然,也许我们现在并不知道到底应该培养哪种人才,也许有的学生会去设计开发操作系统,也许有的学生以后一辈子也不会与操作系统打交道,也许有的学生只是使用操作系统而已。即使如此,一个学校总还是应该有自己的定位的。按照这种定位,就可以制定一个大致的实验方案。
2.2缺乏层次
操作系统实验的设计没有层次感,基本上所有的实验都是针对操作系统的某部分功能实现进行的,如进程管理、内存管理、文件管理等。这些实验都是对一个模拟操作系统或实验室操作系统的内核进行修改,形式单一,这种单调的实验设计对操作系统的整体把握并无太大用处。例如,即使做了修改进程调度或页面更换算法的置换实验,学生还是不明白操作系统是如何具体地服务于用户程序的。这个问题和前面一个问题是互相影响的:由于目标模糊,不能准确定位学生的实验需要,导致实验设计单调;而实验设计单调,又反过来进一步模糊我们的培养目标。
2.3生搬照用
很多学校照搬其他人现成的实验作为本校的操作系统课程实验。如果照搬得当,利用他人的现有成果当然能节省时间和精力,但问题是目前的照搬存在很多问题:照搬的实验与本校对学生的培养目标不吻合;没有完全理解照搬实验的精髓,不能清晰地阐述给学生;构造的实验环境不能完全适应所需的实验,导致实验失败。另外,照搬的实验很多使用实验室操作系统内核,如Minix和Nachos。虽然这些实验室操作系统内核确实可以用来展示操作系统的工作原理,但它们与商用操作系统的差别巨大。有些原理在实验室操作系统上可行,在商用操作系统上却行不通。这样,即使学生了解了这些实验室操作系统内核,到了工作单位面对商业操作系统时,仍然是一筹莫展。
2.4没有趣味
众所周知,人在做自己感兴趣的事情时,积极性会明显高于自己没有兴趣的事情,效果也会好很多,而现在的操作系统实验设计却往往缺乏趣味性。大部分实验无非是修改这个,置换那个,实现某一微小操作系统功能等。这些东西对于本来就对计算机和操作系统很执着的人来说,可能并不乏味,但对于很多人来说,修改或微调一个进程调度算法并不是一件激动人心的事情。
3对改进操作系统实验设计的思考
根据以上的分析,要改变现有的实验课程缺陷,就需要首先明白我们培养学生的目标是什么。明确目标后,才能知道学生对操作系统实验的需求是什么,在此需求基础上,就可以有针对性地制定操作系统实验方案,以适应不同素质和不同能力的学生。例如,我们在进行课程实验设计的时候应该问一下,我们的教学目标是培养操作系统设计师吗?还是培养能够使用操作系统底层服务的软件工程师?还是培养能够熟练安装使用操作系统的技术操作员?
我们认为,操作系统课程并不一定需要进行操作系统功能实现的实验。认为所有操作系统课程都需要进行同样程度、类似功能的实验,其实是长久以来形成的一个误区。很多学生将来并不会在操作系统领域工作,甚至不会在软件领域工作,让这些人做那些进程实现、内存管理实现或者文件系统实现等实验,似乎没有什么必要。对于这些学生,即使他们做了复杂的操作系统实验,也不会记得很久,甚至实验完了还是没有搞清楚操作系统是怎么回事。
因此,在设计实验方案时,必须心中想着不同学生的需求,从多个层面上设计不同的实验,形成高低错落有致、难易搭配有方的一套组合实验,并能够根据具体情况动态调整实验的实施方案,以适应学校的培养目标,同时兼顾到部分同学或高或低的需求。基于这些考虑,我们的实验设计就必须具有丰富的层次,而设计出的实验也就会目标明确,层次丰富,也不会有生搬照用的各种缺陷。
此外,我们还应该力求在实验设计中引入趣味性,将操作系统底层实验与用户层面的应用连接起来,形成由实际需求驱动的操作系统实验设计,从而提升学生做实验的兴趣。
4操作系统实验设计中的五重奏哲学
前面说过,实验设计必须与教学目标联系起来。如果我们的目标只是普及操作系统知识,则无需进行操作系统实验或只进行简单的操作系统壳的使用实验即可。但如果学习操作系统的目的是为了将来设计、改进或精湛地使用操作系统,则需进行较为复杂的操作系统实验。根据目的的不同,我们推荐将操作系统实验分为图1所示的五个层次:
每一层次针对一种培养目标,每个层次都要求学生在熟悉下面一个层次实验的基础上,进行新的针对该层次的实验。五个层次上的实验可以根据学校不同、学生素质与能力不同而单独或组合使用。例如,对于一般的职业学校,只要进行第1和第2层实验即可;对于大部分的普通大学,则进行第1、第2、第3层的实验;重点大学则进行1~4层的实验。对于少数素质高、能力强的学生,可以实施全部5个层次的实验。这种高低搭配、错落有致的实验层次如同不同的“音乐声部”,一起合成一首质感丰富的“交响乐”。这就是本文的操作系统课程实验设计的五重奏哲学。
4.1了解操作系统层次
这是学习操作系统的最低层次,也称为扫盲层次,目的是为了对操作系统的概念、实体有点概念。对这个层次的学生来说,操作系统实验就是启动一个操作系统,然后对操作系统提供的用户界面进行一些操作。这一层次的实验全部在操作系统壳的上面进行。
4.2使用操作系统层次
这是学习操作系统的第二层次,目的是为了能够更好地使用操作系统。在操作系统出现问题时,能够简单判断出现问题的原因,并找出对策。对这个层次的学生来说,设计的操作系统实验以使用为主:即让学生通过各种现有或老师自编的操作系统探索工具来窥探操作系统运行时的内部状态及其在系统外层的表现。这种工具在Unix、Linux和Windows上都有很多。例如,对于Windows操作系统来说,其窥探工具包括Process Explorer、Performance Monitor、File Monitor等五六十种工具。这一层次的实验通常跨越操作系统的壳(有些在壳的上面,有些在壳的下面)。
4.3操作系统编程层次
这是学习操作系统的第三个层次,比使用操作系统的层次高了一个境界。这个层次的学习是为了能够在程序设计或软件开发中利用操作系统提供的系统服务来达到系统程序设计的目标。对于该层次的学生来说,设计的操作系统实验应当以对系统调用的使用为主,通过操作系统提供的编程界面来编写一些工具软件。Linux、Unix、Windows都有大量的系统调用可供我们进行系统编程。例如,我们可以要求学生通过对Win API的使用来编写4.2节里面提到的某个工具软件,如File Monitor。这一层次的实验完全在操作系统的壳下面进行,但尚未进入到内核里面。
4.4操作系统改进层次
这是学习操作系统的第四个层次,也是一个较高的层次,从操作系统的外围进入到了内核。该层次学生以进入工业界维护和改进操作系统或学术界进行操作系统研究为己任。对于该层次学生来说,设计的操作系统实验应当以对操作系统本身的修改为主,对一些实验室操作系统如Minix、Nachos等进行修改,以改善或置换某种具体的功能:如设计一个调度方案来置换Minix里面的调度算法,或者为Nachos补充一个管程机制等。如果有条件,建议在商用操作系统上进行内核修改。例如,使用微软提供的WRK就可以进行很多有趣的Windows内核修改实验。
4.5操作系统设计层次
这是学习操作系统的最高层次,适用于把研究、设计、开发操作系统作为己任的学生,这个层次的实验是为培养操作系统大师而设计的。显然,进入这个层次的学生应该对操作系统的每个核心功能都非常熟悉,并且有某些上手的经验。为此,操作系统实验的设计就必须要求学生自己设计出某个完整的操作系统功能,如完整的进程管理功能或完整的内存管理功能等。但如果设计完整的功能模块有难度,也可以适当降低要求。例如,对于内存管理来说,可以只要求学生实现一个内存页面服务器。从另一个方面来说,如果学生能力很强且条件允许,也可以要求学生设计一个完整的操作系统。如果有条件,还可以让学生对商用操作系统的源代码进行分析。
五重奏哲学虽然使得操作系统的实验设计具有层次丰富、逻辑递进、搭配灵活的良好特性,但要将这些良好特性的作用完全发挥出来,则还需要想法提高学生做实验的兴趣。而要让实验具有趣味性,就不能在设计操作系统实验的时候尽做些枯燥的纯功能性的实验。在进行修改操作系统内核实验时,不要设计那些为了修改而修改的实验,如修改页面替换算法实验、修改磁盘调度实验,或者某个同步机制的实现实验等,而是应该尽量将趣味融于到实验里,将操作系统的某种功能实验融入到某个有趣的应用开发里面。即我们是为了开发一个很有意思的应用,但在现有或者目前所提供的操作系统上面难以完成此种开发,需要对操作系统进行修改才能完成。这样就顺其自然地涉及到操作系统本身的使用、改进或设计上来,而这种把应用连带进来的做法将使实验的趣味性得以增强。
5实验设计举例
本节我们以自行设计的两个操作系统实验来说明五重奏的设计哲学。
5.1杀无赦
在设计操作系统内核修改实验时,我们设计了一个“杀无赦”的实验,驱动这个实验的动机来自于许多人都有的亲身经历:打开Windows的任务管理器可以看到许多进程,但有些进程却无法删除,或者删除后马上又会再次出现。另外,有些进程并不呈现在任务管理器里——这种情况常常令人非常沮丧——“杀无赦”实验就是要消除这种沮丧。从应用层面上看,这个实验要求学生实现一个类似Windows任务管理器的应用,但与Windows管理器不同的是,该管理器必须能够显示所有在系统中活动的进程和线程,包括病毒或者隐藏的进程。另外,管理器必须能够杀掉任何一个进程,即时导致计算机关机也在所不惜。当然,如果终结进程会导致关机,该管理器须要给出警告。
很显然,仅仅使用操作系统提供的系统调用是很难完成上述任务的。因为所编写的任务管理器无法保证能够在病毒前面进入系统并启动。但如果能够修改操作系统内核,此任务就可以完成。这样就自然地引入对操作系统内核的修改,达到实现该“杀无赦”任务管理器的目标。
此实验囊括下面四个层面:壳上启动与观察、壳下窥探内部状态、使用系统调用编程、需要修改内核。由于此实验能让学生直接体会到工作的成果,开发的管理器可以在自己的电脑上大显身手,学生的积极性明显高涨。有的学生在做完实验后还意犹未尽,在课程结束后还在继续修改完善本实验。
对于能力很强的学生,我们可以将本实验扩展为整个进程管理,从而形成完整的五重奏。
5.2进程干冻
我们设计的另一个比较有趣的实验是“进程干冻”,该实验也是从实际需要开始导入。很多人都有过这样的经历:一个任务进行到一半而被打断,后来再进行时需要从头开始。例如,在打印一个80页的文件时,如果打印了50页后系统突然崩溃,则下次系统重启后再交付打印任务,前面的50页还会再打印一遍。但这并不是我们所需要的,这时如果从第51页打印开始不就好了?
正是出于上述考虑,我们设计了一个实验对进程进行“干冻”,即将进程定格在某一个时刻,并存储在磁盘上。下次系统重启或程序重载时,直接从刚才定格的地方开始执行——例如从第51页开始打印。如果前面第50页只打印了一半,系统重启后还可以从第50页的后半部分开始打印。
同样,该实验涉及到对操作系统内核的掌握。如果只使用系统调用(操作系统API),则实现的进程干冻功能较为有限,因为有不少进程状态在系统调用层无法捕捉。但如果可以修改内核,则大部分进程状态都可以被捕捉,从而大大增加进程干冻的威力。基于此,该实验也可以分解为使用系统调用和修改系统内核两个子实验,分别布置给具有相应能力的同学。
此实验同样囊括了五重奏里面的四个层面:壳上启动与观察、壳下窥探内部状态、使用系统调用编程、需要修改内核。由于实验将内核修改和应用开发连接在一起,实验的结果很容易观察到,并且也有实际价值,学生对该实验的兴趣明显强于那些纯内核修改实验。
对于能力很强的学生,我们可以将本实验进行扩展,将“进程干冻”升级为“操作系统上翻”,把对实验的要求上升到操作系统设计的境界,从而形成完整的五重奏。
6实验设计的其他考虑
除了前面介绍的“杀无赦”和“进程干冻”外,我们还有一系列在Minix、Nachos、Linux和裸机上的操作系统修改或设计实验及各种各样的内核窥探实验。这些实验根据每年学生的具体情况进行动态调整,同一个实验也可以设计为不同层次的实现。例如,我们在上一节讨论过的“进程干冻”实验就有两个版本:一个在系统调用级实现,即使用操作系统API来实现(实现的功能较弱);另一版本为内核修改版,即通过修改内核结构和功能来实现(实现的功能较强)。
如果有合适的他人设计的操作系统实验,当然也可以照搬。事实上,在可能的情况下,也应该尽可能共享他人的优秀劳动成果。但是在照搬的时候,一定要确认搬来的实验设计必须符合本校的整体课程设计目标,在层次、程度和对实验环境的要求上均符合学校的具体情况。在照搬的过程中,需要完全理解这些实验的精髓,并能够详细、清楚地阐述给学生。此外,实验环境的搭建必须精准。为方便修改和不影响其他课程对设备的使用,我们推荐使用虚拟化技术来进行实验环境的构建。
7结语
操作系统实验作为操作系统课程教学的重要组成部分,对于学生对操作系统的理解和把握有着重要的影响。如果能因地制宜、因时制宜,根据每个学校的具体情况设计层次丰富的适合本校学生的操作系统实验,对保持学生学习操作系统的兴趣和加深对操作系统的理解都有重要的意义。本文提出的操作系统实验设计中的五重奏哲学和实验与应用结合的趣味实验设计,就算是在这方面的一次抛砖引玉吧。
参考文献:
[1] 邹恒明. 计算机的心智:操作系统之哲学原理[M]. 北京:机械工业出版社,2009.
[2] Andrew Tanenbaum. 现代操作系统[M]. 陈向群,马红兵,等译. 北京:机械工业出版社,2009.