首页 理论教育 “操作系统”课程教学方法改革

“操作系统”课程教学方法改革

时间:2022-03-09 理论教育 版权反馈
【摘要】:操作系统课程与其他计算机专业课程一样,其所关联的知识更新快,且课程的实践性比较强,需要加强实践教学环节,使学生在实践中掌握分析问题、解决问题的能力。因此,学习、掌握操作系统知识的方法有其鲜明特点。强化实验环节,边干边学,把操作系统理论课与实践课融为一体。操作系统课程的教学中,进程(线程)同步与互斥是重点和难点之一。

“操作系统”课程教学方法改革

季江民 李善平
 计算机科学与技术学院

一、课程简介

1.课程类别

计算机专业基础课程

2.学科类别

工学—计算机科学与技术

3.教学目标和教学内容

(1)课程目标:

通过本课程的学习,要求学生理解操作系统在计算机系统中的作用、地位和特点,熟练掌握和运用操作系统在进行计算机软硬件资源管理和调度时常用的概念、方法、策略、算法、手段等。通过对Linux操作系统的介绍,了解操作系统的一般性体系结构,了解相关方向的发展趋势。通过完成操作系统的实验环节,使学生掌握开发一个操作系统的实用技术。通过外文教材的讲授和学习,使学生在专业英语资料的阅读和理解上达到应有的水平。

(2)教学内容:

操作系统教学内容以浙江大学计算机学院精研课程之要求而设计,包括进程概念、进程状态、进程控制块、进程队列、进程上下文、处理机调度、临界区、进程同步、信号量、经典同步问题、死锁、死锁预防、死锁避免、死锁检测、死锁恢复、存储管理、分页式存储、分段式存储、虚拟存储、请求调页式、页面置换、抖动、工作集模型、文件、文件操作、文件访问权限、文件目录、文件系统、典型文件系统、文件空间管理、大容量存储、磁盘调度等知识点的教学。也包括3~4次课程研讨环节,研讨主题跟踪计算机操作系统前沿,均于当年指定。

作为课程组成部分和课程特色,同步安排了操作系统实验,包括关于Linux内核知识的8次16学时的授课,教学内容有Linux内核编译、Booting过程、内核模块、Linux进程管理、Linux系统调用机制、Linux虚拟内存管理、Linux物理内存管理、Linux文件系统、Linux设备管理、设备驱动程序;以及4个学生大型实验,内容选自Linux环境、内核重建、系统调用、存储管理、文件系统、内核模块、驱动程序。

该课程于2006年起列入“国家精品课程”。

4.教学对象

浙江大学计算机科学与技术学院、软件学院、竺可桢学院各专业的三年级学生。每年开设5个左右教学班,每班人数控制在60人以内;采用小班化教学。

5.课程学时与教学场景

(1)课程学时:课程教学64学时,实验教学32学时。

(2)教学场景:课堂教学在多媒体教室;实验教学在计算机学院实验机房。

二、课程教学重点解决的问题

操作系统课程与其他计算机专业课程一样,其所关联的知识更新快,且课程的实践性比较强,需要加强实践教学环节,使学生在实践中掌握分析问题、解决问题的能力。

操作系统原理课程相对于其他计算机专业课程,还面临更棘手的特征:课程内容脱离实际系统,看不到典型系统的影子;课程知识点抽象,内容体系松散,学生理解有难度;操作系统属于系统软件,明显区别于应用软件。因此,学习、掌握操作系统知识的方法有其鲜明特点。

综上,课程教学中,强调从学习操作系统知识点,转移到掌握学习(操作系统)知识的能力,边干边学,使学生在实践中培养分析问题、解决问题和获取知识的能力。

三、教学方法改革

1.教学实施策略与方法

针对课程教学的目标和教学中重点解决的问题,目前课程采用的教学实施策略和方法主要有:精讲、研讨和勤练;操作系统的原理学习与实验有机结合。

(1)精讲、研讨和勤练。教师在上课过程中讲重点和难点,讲基本的概念、原理、算法,上课中穿插12个程序实例演示和flash演示,如进程、线程创建程序实例演示和flash演示等。师生互动研讨:安排3~4次大型课堂研讨,每个学生上台演讲8~10分钟;每次上课进行课堂讨论;每个学生至少撰写并提交2个研究报告。强化作业和练习:在课程网站的作业系统中布置大量的作业和练习;平时4次小测验,用以评价学生平时的学习情况;贯穿整个学期对各章节的习题分析,深化理解和掌握操作系统的概念、原理及算法。

(2)理论和实验有机结合。强化实验环节,边干边学,把操作系统理论课与实践课融为一体。操作系统实验可帮助学生理论联系实际,巩固和复习所学过的操作系统概念与原理,从而帮助学生能够更深刻地掌握操作系统的整体运行机制及局部实现方法,增强学生实践能力,提高学生综合分析问题和解决问题的能力。安排16课时的Linux内核分析;每个学生至少完成4个大型综合实验,并对每个同学的所有实验进行验收评价。

2.具体实施方法举例

操作系统课程的教学中,进程(线程)同步与互斥是重点和难点之一。用边分析讨论边实验的方式,使学生循序渐进理解和掌握同步与互斥知识。

通过描述问题、问题的实验验证、分析讨论解决方法、解决方案的程序实现等四步,循序渐进地展开教学,使学生既能深入理解掌握理论知识,又能通过实验编码验证理论。

(1)描述问题。

操作系统的进程同步教学中,有个经典的生产者与消费者(Producer-Consumer)问题。有一种解决方案为Producer进程、Consumer进程分别定义了:

img100

这里隐含一个问题:假设count变量的初值为5;编译系统将高级语言count++和conut--语句分解到一组汇编指令:

producer:regist er 1=count(regist er 1=5)

producer:regist er 1=regist er 1+1(regist er 1=6)

consumer:regist er 2=count(regist er 2=5)

consumer:regist er 2=regist er 2-1(regist er 2=4)

producer:count=register1(count=6)

consumer:count=register2(count=4)

那么,让Producer进程和Consumer进程各执行一次循环后,由于进程调度顺序的随机性,使得count的执行结果可能是5,也可能是4,也可能是6。

为了消除因操作系统进程调度算法引起的进程执行顺序不确定性,有必要引进“进程互斥”的概念以及解决方案。

(2)问题的实验验证。

通过一个程序实验来验证上面描述的问题,如果各线程访问同一个共享变量,程序多次运行会引起结果不一致。通过对程序的运行结果的分析,实验证明多个线程(进程)对共享变量的访问必须要实现互斥。通过这个实验使学生进一步理解和掌握进程(线程)的互斥。

本实验程序创建两个线程,这两个线程共享同一个变量conut,程序多次执行打印的count值不一致。实验题如下:

下面的程序pt.c使用pthread线程库创建两个线程,两个线程都要访问共享变量count,程序代码如下:

img101

img102

img103

用gcc编译程序:gcc-o pt pt.c -l pt hread

按照源程序的逻辑,两个线程各循环5次,每次循环对count变量加1,最后打印的结果应该是10。在你的系统中,编译并运行程序,观察运行结果,请回答以下问题:

①程序运行后,最后打印的count是多少?

②第1个线程中同一次循环的LINE A行的printf和LINE B行的printf值是否一样?假设程序中LINE A行和LINE B行之间有很多代码,并多次引用count的值,线程的运行结果会如何?

③请你多次调整两个线程中sleep函数的参数(即调整线程的睡眠时间),最后打印的count值会出现什么样的变化?

④请修改源程序,使用pthread的互斥锁机制,使得程序运行的结果正确,不管两个线程中的sleep函数的参数值是多少,最后打印的count值总是10。⑤通过这个程序例子,你得出什么结论?(3)分析讨论解决方法。

给出进程互斥的问题以后,如何解决进程的互斥问题呢?先从理论上讨论解决进程互斥的各种方法。在课堂上分析和讨论5种进程互斥算法。在分析讨论互斥算法的基础上,再全面分析和讨论经典的进程同步问题。

软件互斥算法1:设计一个turn变量保障双进程互斥。但是不能满足空闲让进(Progress)条件。

img104

软件互斥算法2:设计一个flag数组保障双进程互斥。但是不能满足空闲让进条件。

img105

img106

Peterson算法:同时运用一个turn变量、一个flag数组保障双进程互斥,并且满足空闲让进条件、Bounded Waiting条件。

但是,Peterson算法只适用于双进程。

img107

Lamport的Bakery算法:适用于N个进程的互斥。但是,要求N有上界。

要求程序员将这些算法代码嵌入用户程序的准确位置。

img108

信号量方案:不限定互斥进程的总数,只要按如下框架规范使用。

img109

img110

(4)解决方案的程序实现。

生产者和消费者是一个经典的进程同步问题,通过多线程编程模拟实现生产者和消费者同步问题,真正理解进程同步与互斥理论或算法。

使用pthread线程库互斥锁机制和POSIX的信号量机制编写生产者及消费者之间同步和互斥程序。通过学习编写多线程程序,掌握在Linux环境下如何编写同步与互斥的应用程序。实验题目如下:

编写程序实现生产者—消费者经典进程同步问题。使用Linux的pthread线程库,创建2个生产者线程和2个消费者线程。生产者线程计算当前的时间,把时间、第几次计算的序号(循环次数)和线程ID作为一个消息,把消息放入缓冲区,消费者线程从缓冲区读出一个消息并显示消息。缓冲区大小为5个,每个生产者线程生产10个消息,每个消费者线程消费10个消息,即生产和消费分别为20次。

要求:2个生产者线程执行的代码是相同的(即执行同一函数),2个消费者线程也一样。

3.教学方法特点分析

本课程教学内容比较偏重实践与原理结合,强调在实践中掌握提升分析问题、解决问题和学习的能力。因此,课程教学中选用了研究性学习导向的教学方法,主要特点有:结合Linux的实验,从实践中掌握学习能力;以系统设计、开发的视角,学习操作系统原理;注重讨论式互动式教学,引导学生进行自主式探究式学习。

(1)结合Linux的实验,从实践中提升学习能力。

在操作系统教学时,不拘泥于操作系统原理的书本内容,而是紧紧结合Linux内核,将Linux作为实例来分析,诠释操作系统原理中抽象的知识点。这不但加深了学生对于操作系统原理的理解,而且开始逐步熟悉Linux技术。

(2)以系统设计、开发的视角,学习操作系统原理。

在软件系统生命周期中,软件系统的设计阶段通常经历:描述问题;提出若干针对该问题的解决方案;分析和论证这些方案。操作系统的教学方法,也借鉴这个过程,由此帮助学生体验并强化其科研能力。

(3)注重讨论式互动式教学,引导学生进行自主式探究式学习。

按照计算机学院精研课程的要求,课堂教学活动中,注意课堂学生的反应。课堂内容展开依照操作系统软件特有的event driven形式,而不是应用软件的top down menu形式。授课时不拘泥于教材内容的排序,而是注重对各知识点进行重组和精炼。当然,针对课程知识点多、专业难度偏大、学时数限制的情况,课堂教学中注意避简就难,突出解决重点、难点。

同时,开展对于本章内容的综合性应用讲座,要求学生通过查阅文献资料,了解当前操作系统的前沿技术,撰写研究报告,并请学生上台演讲。引导学生进行自主式探究式学习,培养学生对知识点的深层理解、分析、比较和融会贯通的综合能力。

四、课程考核方法和支撑手段

1.课程考核方法

可以根据具体情况,分操作系统原理和实验两部分来考核计算成绩,也可以把原理和实验综合起来考核计算成绩。下面是把原理和实验分开计算成绩。

(1)“操作系统原理”部分。

“操作系统原理”部分课程成绩(100分)由下面几部分组成:

● 课堂测试       12%

● 作业         18%

● 研讨         20%

● 期末考试       50%

课堂测试3~4次,内容紧扣知识点,难度与作业题相仿。

课堂研讨部分包括课堂的即时讨论,以及专场安排的seminar。Seminar共3次,选题类型有:Review of Reading Part One,Survey on Advanced Technologies,Linux/Windows/Unix System Call。几年来,学生们的题目比较丰富:

● A Glimpse For Time Sharing

● Distributed System

● 浏览器vs操作系统

● Process&Thread in parallel optimization

● A Brief Survey of Linux System Calls

● 非阻塞I/O系统调用——select()和poll()

● Future of OS

● 网络化的操作系统

● 安全操作系统综述

● Web 3.0背景下的操作系统

● Google Chrome OS?

● Web OS

● 网络操作系统(NOS)

● The Evolution of GUI:from Technology to Life

● 分布式系统与云计算等系统的比较

● 手持操作系统之Android篇

● BONIC:Compute For the Future

● VIRTUAL MACHINE

● Parallel Computing

● Retrospection of Batch system

● OS/2:IBM无奈的失败

● Tracing Technology

● SUN公司的File System的历程

● Summarization of Technique for File Security using Extended File Attributes in Solaris 9

● 系统用户认证的过去、现在和将来

● Solaris:Dynamic File System

● Operating System Performance and Tools

● CPU Scheduling:the Base of our Daily Life on PC

● 动态跟踪系统综述

● Linux系统调用的实现机制分析

● 动态添加系统调用原理与方法

● System Call Implementation of Microkernel

● exec Family in Linux:a Topic on System Call

(2)“操作系统实验”部分。

“操作系统实验”部分课程成绩(100分)由下面几部分组成:

● 课堂测试  5%

● 实验验收  15%

● 实验报告  30%

● 期末考试  50%

2.网络支撑手段建设

本课程遵循国家精品课程的要求,配套建设和维护课程教学网站http://os.zju. edu.cn。网站中,被经常使用的功能模块包括作业系统、论坛、Linux内核源代码等。

五、教学效果和推广性分析

1.教学效果

本课程的教学方法改革自20世纪90年代起持续不断,典型标志包括采用英语教材,Linux内核分析,操作系统实验,系列教材,国家精品课程,计算机学院精研课程,全英文教学,等等。改革效果良好,获得了历届学生很好的评价。典型评价有:(1)同学评价之一:

这学期的操作系统课程过了一大半了,在这一学期的学习中,我收获了不少的专业知识,也从老师的平时课堂的一些拓展讲解上得到了很多帮助,包括人生规划的建议,都是从老师的一些介绍中获得的。所以总体来说很感谢老师的辛勤授课与指导,我受益匪浅。下面来总结下我认为的课程优点:

现代化的作业系统。这是个很大的优点,跟以往其他课程的纸质作业比较,不仅效率高,能准确地卡好时间,防止抄袭。选择题模拟真实考试,训练效果好,也大大减少了人工批改作业的麻烦。虽然老师会复查一些主观题,不过已经很高效了。

②课堂演讲和讨论是一个很好的栏目,不仅能够巩固我们已学的知识,还能开拓学生的视野,活跃学生的思维,帮助我们创造性、批判性地吸收知识和技能,达到精研课的目的。

③上课的课件清楚明了,形象直观,把抽象的原理用形象的讲述和实例加以剖析,深入浅出,让学生容易理解和消化。

④穿插考研的题目和经验讲解,这对考研学生帮助很大。

……

操作系统的课程做能让我们在理解操作系统基本知识和技术的同时得到发散性思维训练,培养我们兴趣,打牢研究基础,为我们以后的进一步深造铺平了道路,指明了方向。

(2)同学评价之二:

首先是颇具特色的研讨课,极大地锻炼了我们自主学习的能力。课堂学习固然重要,但课外的自主学习对我们有着不容忽视的意义。大学里学的不只是基础知识,更要学会如何自主学习,只有这样,在我们走出课堂、走向社会以后,才能源源不断地学习更加广泛的知识,有能力解决更加实际的问题。研讨课的层次分明,从概念性的综合,到技术性的研究,指导我们一步步地深入学习下去。尤其是最近这次关于内核系统调用的研究,我们小组分工各花了几天的时间进行专题的研究,下了很大的工夫,虽然有点累,但事后都很有成就感,研究的过程很值得回味。至于在课堂上作报告,极大锻炼了我们的沟通交流能力,同时也对研讨的质量提出了更高的要求。

其次是课堂的氛围十分活跃。未在课堂做报告的同学要通过课堂讨论来得到相应的平时分,这极大地刺激了我们的课堂发言积极性。

……

(3)同学评价之三:

我认为研讨课是一种很好的学习方式,与国外的学习方式类似,学生可以通过课下的读论文和找资料来对某个课题产生更深刻的理解,这有助于同学的自主学习能力的培养,同时锻炼了同学做presentation的能力,让同学在众人面前变得更为自信,阐述个人观点的能力也大大增强。……

(4)同学评价之四:

实验和操作系统理论课的知识联系在了一起,可谓一举两得。学习的过程是漫长的,但是只要付出了努力,就一定会收获成功的喜悦的!……

2.推广性分析

本课程教学方法的实施需要有以下条件支撑:

(1)需要小班教学。由于课程学习依赖互动方式,要进行课堂讨论和课堂汇报,因此如果教学班人数过多将难以保证教学质量和效果。

(2)需要学生花更多的时间和具有良好的学习主动性。为了课堂学生研讨,教师授课时间压缩掉9学时以上。因此,需要压缩课堂教学内容,增加学生自学时数。这样,考试范围不仅包括课堂上讲过的知识点,而且更多地包括学生自学的内容(既有教材内,也有教材外),做到“讲1做2考3”——即老师“讲”核心知识点,学生“做”部分知识点的深入研究,“考”全部研究题目覆盖的范围。

六、课程教材

[1]Abraham Silberschatz等.Operating System Concepts(7th edition).北京:高等教育出版社,2007

[2]李善平,季江民,尹康凯.边干边学:Linux内核指导(第二版).杭州:浙江大学出版社,2008

其中,[1]是全球最著名的操作系统原理教科书;[2]用于Linux内核实验。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈