李文娟 王李冬 寿周翔 赵海丽
摘要:操作系统原理是本科计算机科学与技术专业的主干课程,也是构建计算机专业知识体系的核心环节,然而传统“重理论讲授、轻实践能力培养”的教学模式严重影响了该课程的教学效果。为此,本文在分析课程教学现状、阐明传统教学中存在的一系列问题的基础上,提出了“源码嵌入式”理论教学改革新模式。并以此为契机,构建了一套分层立体式驱动的实践教学支撑体系。教学实践表明,新的教学模式和方法能够有效提高本课程的实际教学效果。
关键词:教学改革;操作系统原理;多层次实践教学体系;源码嵌入式教学模式
1引言
操作系统是计算机系统的灵魂与核心,是底层硬件系统向软件系统的第一层扩展、实现软件和硬件协同工作的指挥棒,具有极其重要的地位和作用。《操作系统原理》课程的教学内容是架构完整的计算机专业知识体系不可或缺的重要组成部分,因而被ACM、IEEE和教指委列为计算机科学与技术专业的核心专业课。本科阶段《操作系统原理》的教学目标是使得学生系统掌握操作系统的设计原理、各组成模块的主要功能和实现技术,具有初步操作系统开发和维护的能力。然而事实是:操作系统已然成为计算机专业课中最难上难学的课程之一。其原因主要有两点:一是課程涉及的知识面广、概念和原理众多,理论性强,如果教师缺乏足够的驾驭能力,很容易将课程上成“伪政治课”,导致理论与实践严重脱节,无法真正实现课程的培养目标;二是这门课程的实践环节较难与实际应用项目挂钩,理论与实践存在较大距离,不易激发学生的学习兴趣。
为了改变现状,更好地完成《操作系统原理》的教学任务,提高学生动手实践能力,帮助学生系统架设起学科知识体系,我们在教学实践中,努力探索、总结经验,提出了一套教学改革的新方法。首先,在理论教学中,我们提出了“源码嵌入式教学法”,即在讲授操作系统原理的过程中结合开源操作系统(Linux或minix)的源代码帮助学生获得实际操作系统设计的直观感受。其次,我们设计了一套分层立体式实验教学体系作为理论教学的有益支撑:通过实验验证基本原理、观察操作系统现象、学习基于操作系统的应用和开发。从几年的教学反馈来看,获得了良好的教学评价和效果。
2存在问题分析
作为最底层的系统软件,操作系统在计算机系统中的特殊位置决定了操作系统原理这门课在计算机科学与技术知识体系中的特殊地位。纵观目前该课程的教学现状,普遍存在如下主要问题:
2.1理论教学手段仍比较单一
尽管不断有新的教学理念和教学模式出现,比如翻转课堂、微课、慕课等,但大多数院校仍采用传统的理论教学方法讲授本课程。由于缺少先进的理论教学配套演示环境,使得任课教师大多数时候只能站在讲台上讲着干巴巴的理论,这显然很难激发学生的学习兴趣。
另一方面,目前大部分操作系统教材内容比较陈旧、脱离新技术和新应用,让学生有种学无所得的感觉。并且传统操作系统教学往往仅从理论上讲授操作系统的几大主要功能模块,忽略了对具体实现技术的分析。在这种教学模式下,教师对概念和原理的讲解通常是晦涩抽象的,学生没有真正理解概念或原理,更不要说消化吸收这些知识并加以应用于实际的操作中。而此时如果教师还一味地让学生吸收课本上的内容,这很容易让学生误以为操作系统的知识是枯燥、乏味和无用的。
2.2缺少科学的实践体系支撑
尽管《操作系统原理》是一门理论和实践性都很强的课程,但长期以来在教学设计中往往对实验环节缺乏足够重视,实验学时很少,少数院校甚至未设置实验学时。即便开设实验课的院校开出的实验也大多是一些简单的验证性实验,实验内容陈旧,综合设计类或探索创新类的实验很少或是没有,没有形成能够对理论教学起到良好支撑作用的实验教学体系,无法很好地完成理论与实践的衔接。这使得学生学习本课程很难获得自主程序设计的快乐和成就感,最终仅接触到操作系统的皮毛,严重影响了教学效果。
2.3学生的学习热情普遍不高
在教学实施过程中我们发现,大多数学生对本课程的学习兴趣不浓、积极性不高。经过仔细调研,我们发现主要有两方面的原因:一是学生中存在“操作系统无用论”。由于操作系统原理的学习不像其他项目类课程,可以立马看到学习成果。比如学生在学习网页设计之后可以进行网页制作,学习移动安卓开发之后可以进行简单的APP设计。而学习完操作系统的本科生却很难开发一个操作系统,因此有一部分学生认为操作系统学不学没有太大关系。二是全面深入地学习操作系统难度较大。由于“操作系统原理”是一门理论性和综合性都很强的课程,学好这门课需要具备较强的软硬件知识基础,以及较强的逻辑和抽象思维能力以及扎实的编程功底等,课程学习的难度无形中增加了学生的畏难情绪。
3“源码嵌入式”理论教学模式
Linux操作系统的创始人Linus认为,要准确理解操作系统的运行机制必须阅读其源代码。尽管操作系统原理课讲述了操作系统的基本工作原理,然而原理毕竟是原理,它省略了很多细节,而这些细节正如麻雀身上的羽毛,是构成一只完整的麻雀不可或缺的组成部分。因此,学好操作系统不仅应该学习操作系统的基本工作原理而且应该至少了解一款具体操作系统的实现方法。而阅读源代码正是学习系统实现的最佳途径。目前开源操作系统Linux为我们学习操作系统具体实现提供了极大便利。在理论课讲授操作系统各组成部分的工作原理时,我们向学生展示Linux对应功能模块的内核源代码,讲解对应模块的主要数据结构定义和功能函数的设计实现等,引导学生通过阅读源代码来深入领会操作系统原理的具体实现方法。此外,在课堂教学中,我们还辅以“问题情境法”,提出诸如“基本原理与具体实现有何对应关系”、“这个模块或数据结构是否是必不可少的”、“有没有优化的可能”等一系列具有启发性的问题,鼓励学生进行分组讨论、深入分析和探索。在教学设计上我们依据从抽象到具体,又从具体提升到抽象的螺旋式上升的过程,引发学生进行全面思考,最终达到对操作系统原理和工作机制的深入理解。例如在讲进程的概念时,我们向学生展示Linux任务数据结构task_struct,帮助学生理解PCB中包含的主要内容;在讲系统调用时,给学生看Linux中包含系统调用编号的头文件mlistd.h;在讲解进程创建时,我们向学生展示fork0、vfork0与clone0函数的内核源码。通过阅读源码,学生很容易领悟进程创建的实质、创建的主要流程,不同创建方法的差异等。
“源码嵌入式”理论教学法在实践中取得了良好的效果,因为通过阅读源代码,学生切实感觉到自己学习的并非是空洞的理論,而是实实在在的具体实现方法,从而大大提高学生对抽象知识及理论的认知程度。此外,为了配合理论课教学,我们还制作了内容丰富的电子教案、微课视频和FLASH演示课件等。我们将诸如死锁、进程状态转换、银行家算法、经典进程同步问题等通过动画呈现给学生,极大提高了学生的学习兴趣。
4分层立体式实践教学支撑体系
我们认为能够对操作系统原理课程的理论教学起到有效支撑的实验教学体系应包括三个递进的层次:操作系统基础实验、设计提高实验和基于操作系统的综合开发实验。为此,我们针对本科计算机科学与技术专业《操作系统原理》课程,编写了配套实验教材《计算机操作系统实训》,配合理论课程的知识由浅入深地逐步展开。
4.1基础实验
1)用户接口相关实验
对于计算机专业的学生而言,学习操作系统的最低要求是能够使用各类主流操作系统,能够熟练使用操作系统提供的各类用户接口。因此,基础实验部分,我们首先安排了Windows和Linux两款操作系统用户接口的相关实验。Window部分包括常用的DOS命令、批处理程序,WIN-API编程基础等;Linux则包括GNOME桌面环境、vi、SHELL命令和SHELL程序设计等。
2)操作系统的开发工具
操作系统提供了丰富的应用程序开发工具和开发平台,包括文本处理工具、图形图像处理工具、软件开发和维护工具等。而操作系统的先修课程大部分是以Windows系统的开发平台为背景,故学生基本具备了Windows操作系统常用开发语言和开发平台的基础知识和编程能力。为此,本部分实验将重点放在引导学生学习Linux操作系统的开发工具,包括语言编译器GCC、调试工具GDB和大型程序的维护工具MAKE。
3)进程管理部分实验
进程管理体现着操作系统对系统动态工作过程的把控,具有十分重要的作用。进程是本科操作系统原理课程的重要概念,也是影响学生对并发程序设计思想深入理解的重要环节。故在基础部分安排了大量进程相关的实验,主要包括进程的状态及控制、并发现象的观察、进程互斥,进程通信等。
4.2设计提高实验
本课程更进一步的目标是使学生在掌握操作系统基本原理的基础上,初步掌握操作系统模块设计的方法,培养设计操作系统的能力。因而,本实验模块的教学内容涉及操作系统的体系结构、任务管理模型、资源管理模式、任务调度算法、虚拟存储技术等,使学生通过实验真正认识多进程/线程同步、调度策略设计、死锁避免、文件系统、I/O方式等实现原理。
1)经典同步问题
经典同步问题是对操作系统在处理进程同步关系中常见复杂问题的模拟,具有较强的理论和实践学习的价值。因此安排了一系列经典同步问题的仿真实验,包括生产者一消费者问题、读者一写者问题、哲学家就餐问题和理发师睡眠问题等。
2)处理机调度算法
处理机调度策略是关系系统能否实现用户和系统目标的关键因素。为了让学生更加深入理解各种常见调度策略的本质,我们设计了一系列仿真实验,包括先来先服务FIFO、短作业优先、最高响应比、优先级和轮转法等几种调度算法等。
3)死锁问题
死锁是计算机系统在由单道系统进化到多道系统之后,因为并发进程的相互牵制、资源不足,所导致的最严重的问题。为了更好的帮助学生理解死锁的概念,理解死锁处理的各种策略,此部分包含死锁避免的银行家算法实验。
4)其他设计类实验
除了上述主要类别外,还有模拟现代I/O方式的SPOOL-ING系统的仿真实验、引导装载程序、简化的文件系统等设计类实验。
4.3基于操作系统的综合开发实验
操作系统课程的终极目标是在熟练掌握操作系统原理和架构的基础上,培养基于操作系统平台的大型程序设计能力和较大规模项目开发的能力。因而本模块是综合性、创新性的实验。我们针对Windows操作系统和Linux操作系统分别设计了对应的复杂程序开发实验。Windows上主要包括数据库应用开发,多线程应用等实验。而Linux上主要包括SHELL与C的交叉应用、编写自己的SHELL、Linux数据库应用开发、QT编程等。