左 航,杨秋辉,陈 润,何 丹,胡 琼
(四川大学计算机软件学院,四川 成都 610065)
我国的新工科研究与实践项目指南明确指出在专业改造升级路径中应当注重探索专业知识、能力、素质的深度融合,聚焦国家战略和未来产业需求。在十四五规划中再次明确强化国家战略科技力量,打好关键核心技术攻坚战,特别是在事关国家安全和发展全局的基础核心领域。操作系统作为国家所需的核心技术,是支撑众多相关产业发展的基石,所以人才队伍的建设十分重要。
从学科培养角度看,工程教育认证中以学生为中心的理念强调围绕培养目标和毕业要求进行教学安排,操作系统的培养目标应当把学生和用人单位满意度作为专业评价的重要参考依据[1-2]。从学生层面看,课程集程序设计,数据结构与算法,体系结构等多门类知识,实践难度较高,同时其作为研究生入学考试的必考科目,在一定程度上影响学生的深造学习。
因此我们认为操作系统课程应当围绕满足软件相关产业需求和学生学业深造需求,满足国家对国产操作系统人才的需求进行教学设计,从而保证学生具备扎实的理论基础,良好的系统的开发能力,以及持续学习能力和创新能力。
目前国内外大学操作系统课程的常用授课模式与计算机学科中的大多数课程类似,主要是以理论授课为先,穿插讲解部分关键算法代码,最后进行实验的方式开展[3-5],即“理论+代码片段→完整代码实现”方式。其中实验和作业大多以编程项目为主,瞄准专业实践能力的培养,并不重视常规的书面练习题。该模式的优点在于教师的讲授可以条理清晰的勾勒出理论框架,并突出关键算法的代码实现,高效的传达课程重点难点。同时实验设计紧扣几大核心模块,如并发、任务调度、内存管理、文件系统等,力图通过实验具化理论,从而夯实理论基础。
虽然该方案的设计思路清晰,培养目标明确,但由于课程实验需要采用模拟教学系统,会使得实验难度较其他课程更高,因此传统的实验模式将会无形中削弱实验夯实理论的效果。目前实验常用的模拟系统有XV6,PintOS,NachOS 等,其源代码一般有6000至10000+行,模块封装设计有一定技巧,且模块间存在关联,故实验中常常出现牵一发而动全身的情况。因此,学生需要具备两个基本能力,才能更好的完成实验:第一对框架的整体设计、主要功能模块和理论算法有一个比较全面和深入的理解;第二具备较好的程序设计和调试能力。然而学生刚刚学完理论知识,难以快速形成非常清晰的知识脉络和系统认知;且在类似规模系统下的实践经验较少。这些因素都将放大实验难度,使得通过实验夯实理论的预期目标难以达到满意的效果。
与此同时原模式下偏重培养实践能力,轻书面练习将不利于从实践回归理论形成知识体系的闭环;缺乏操作系统领域论文与实验的结合,将导致对学生持续学习能力和创新能力培养的不足;缺乏产业相关软件实验也将使得学生缺乏对产业发展的关注与认知。
课程教改前的问卷调查也验证了上述分析,85%的同学认为课程有助于提高专业基础能力和初步的操作系统编程能力,57%的同学认为实验有助于理解课本理论知识;但仍然有高达78%的同学认为实验编码任务比较困难,而仅有35%的同学认为课程目前的组织方式可以很好的应对深造学习的需求。
秉承工程认证倡导的持续改进理念,我们希望根据调查反映出的难点,在原有的“理论+代码片段-完整代码实现”方法中增加新的迭代环节来进一步优化课程方案,完善和提升培养效果,真正做到加强产学研深度合作,共育数字时代卓越人才。课程的改进将按照知识引入、拓展和综合提升[6]的顺序,迭代递进,最终聚焦在三个问题上,即:实验难度较高不容易入手;书面练习少不利于理论的推导和继续深造;产学研结合不紧密和创新能力培养不足。
首先针对大部分学生反映的实验难度较高的问题,在课堂讲解代码片段的基础上,将实验算法实现分为不同阶段,初级阶段由教师带领阅读框架代码,分解算法的代码实现步骤,带领学生完成示例性代码。本阶段,学生不需要对理论有非常深入的理解,通过依葫芦画瓢的方式完成设计,这一步的主要目标通过教师展示代码实现步骤来帮助学生梳理系统框架及算法流程,初步理解如何将理论转换为模拟系统下的代码。
其次在原有方法中新增“理论综合练习”,对理论知识进行一次迭代,形成“理论+代码片段-完整代码实现-理论综合练习”模式。在本阶段,学生将回归针对理论的书面练习,练习题以优质的考研重难点综合题为主。在学生已经实现和跑通基础算法代码的基础上,综合练习将从具象回归抽象,帮助学生进一步理解理论核心,以及和其他章节的关系。从而达到理论指导实践,实践归理论这样一个学习闭环。
最后增加“论文算法代码实践及拓展”迭代环节,最终形成“理论+代码片段→完整代码实现→理论综合练习→论文算法代码实践及拓展”模式。在本环节,学生需要通过阅读相应的学术论文,并在模拟系统上独立以论文中的方式去具体实现教材经典算法,观察算法性能是否和教材或论文一致。与此同时,配以相应的扩展实验和阅读,引导学生关注本章节知识的产业动态。这一步将扩展学习的深度和宽度,培养学生的创新能力,并强调产学研融合。
新方案在理论和实践中反复迭代,将有利于螺旋式的提升并强化学生的理论和实践能力,从而很好的解决原有模式下的三个问题。
由于内存管理是操作系统概念中核心模块之一,主要包括分页,地址转换及虚拟内存等内容,与文件管理、进程调度等模块密不可分,下面以该部分为例讨论如何进行迭代递进式学习。
在阶段一,课程首先完成了分页,地址转换的理论学习。讨论了TLB,多级页表和反向页表技术,并辅以简单的练习题目,比如地址转换,多级页表计算等,帮助学生建立页表相关基础理论的直观认识。
在阶段二,做初级实验,教师带领学生完成模拟系统NachOS下相关框架模块的导读并实现基础代码。本次实验共需四步,如图1 所示,即开启TLB 模块,加入统计TLB 命中率的代码,实现异常处理函数和线程切换时的TLB处理,由教师带领学生一起完成。
图1 TLB实验流程
其中TLB 异常处理函数采用教学示范替换策略,如图2 所示,以VPN 对TLB 数组长度取余的方式选中被替换项。通过这个简单实验,学生能够理解系统间模块的相互关系,快速跑通TLB 工作流程,明白TLB页表替换模块在系统中的位置和作用,何时被调用,如何影响内存地址转换,从而初步达成将理论转换为代码的实验目标。
图2 TLB异常处理函数伪代码
在阶段三,引入考研综合题型[7],如图3 所示。学生在计算地址和访问时间的过程中,需要将本章节中的地址转换,缺页处理,TLB 替换,驻留集等知识和概念融会贯通。重新回溯理论的综合考察题目,有利于学生整合零碎的概念并形成完整的知识脉络。
图3 TLB综合考察题目示例
在阶段四,拓展章节内容的深度和宽度。首先,让学生独立实现两种经典TLB 替换算法,即最近最少用LRU 算法和随机替换算法。在算法的设计过程中,学生需要解决以下二个问题:如何来记录最近使用次数,以及以什么样的方式实现随机?在分小组讨论后,教师下发论文[8],学生在阅读分析论文后,按照论文给出的方法实现两种替换算法。并在同一测试场景下分别测试实验中三种不同TLB 替换算法的命中率,并对数据进行分析和讨论,验证算法理论分析结果与实验结果是否一致,最终形成实验报告。接着扩展阅读相关的论文,引导学生进一步了解TLB 在现代多核计算机中的具体实现方式。最后引入华为欧拉操作系统实验,了解内核编程及欧拉操作系统底层内存分配相关知识。
至此,算法实现再次回归理论,达到理论与实践的知行合一,实验算法分两次实现大大的降低了实验入手难度;综合练习题的引入即便于学生整合不同章节的知识点;论文的阅读与实践有利于培养学生的创新能力;而欧拉操作系统实验的引入在一定程度上可以激发学生学习国产操作系统并借此融入华为社区和了解产业生态。
新方案中,理论与实验,理论与深造考试,实验与科研论文和业界产品,四者在迭代中实现了产学研的深度融合。迭代通过知识启蒙、知识拓展促进了立体的知识体系的构建与专业实践能力的提升,而论文阅读与欧拉操作系统实验则进一步实现了学生研究与创新,理论与产品专业素养的综合提升。课堂调查显示认为对实验的理解程度更深的同学上升到82%,而认为有助于应对深造考试的同学上升到了53%,认为华为欧拉操作系统相关实验非常有意义的同学达到89%。由此可见,新的教学方案很好符合了工程教育认证和软件工程人才培养的核心理念。