代码剖析在操作系统课程教学中的应用
2011-12-31肖延丽
肖延丽 彭 磊
(1泰山医学院研究生部,山东 泰安 271016,2泰山医学院信息工程学院,山东 泰安 271016)
1 引言:《操作系统》是计算机科学与技术专业重要的专业基础课程,是国家指定的计算机专业考研课程之一。课程讲述的内容并不是针对单一特定产品的操作系统,而是从各种具体的操作系统中提取出经典的设计原理和成熟的实现技术进行介绍。学好《操作系统》对理解计算机系统的工作原理、提高应用程序的设计开发能力,都有非常重要的意义。传统的《操作系统》教学方法主要是以抽象的原理叙述为主,存在着理论与实际应用相脱节的现象。使得学生学完该课程后,难于把所学的知识与常用的操作系统联系起来,从而普遍感觉课程所讲述的理论太抽象、难以理解,甚至有的学生会产生学习操作系统没有实际用处的错误认识。代码剖析法就是结合一个具体操作系统,在讲授抽象理论的同时剖析其源代,对所讲授的内容进行说明和验证。从而避免单纯的理论讲述,引起学生的学习兴趣,提高课程的教学质量。
2 传统的操作系统教学方法
《操作系统》是一门比较抽象、理论性较强而很少有机会得到实践的课程。传统的授课方式主要有以下几种:
(1)纯理论授课方式。即以课本为授课工具,教师完全以课堂讲述抽象理论为主,不结合具体操作系统产品进行讲解或指导学生进行验证性、设计性实验。这种授课方式使得理论严重脱离实际,学生没有可以看的到、摸的着的东西作为参考,对抽象理论很难理解,提不起学习的兴趣。(2)理论授课与验证性操作结合方式。即进行理论授课的同时,选择某个实际的操作系统产品作为实验环境,例如Windows、Linux等。学生通过具体的验证性操作、系统调用来观察和验证操作系统中一些技术。可以了解某些理论、技术的具体实现情况,但实验中既不能修改代码也不能扩充功能,因此只能"知其然,而不知其所以然"。(3)理论授课与模拟编程结合方式。即进行理论授课的同时,选取操作系统中的一些典型技术、算法编程并上机实现,例如:银行家算法、页面置换算法等。但这些算法和程序是虚拟的,并不对系统中的实际资源进行真正的访问和控制。这种方法可以加深学生对某些理论和技术的理解,但是其脱离操作系统的实际,学生不能获得对系统内部实现的直观和具体感性的认识。(4)理论授课与独立设计结合方式。即完成理论授课后,指导学生独立设计一个结构相对简单但功能基本完备的小型操作系统。这是一种理想的教学方法,可以使学生充分理解操作系统的原理与实现技术。但即使是小型的操作系统,其结构也非常复杂,代码量相当大,对刚学习过操作系统,而对其原理理解不够深刻,又没有系统软件开发经验的学生来说,完成这项任务有很大的难度。
3 代码剖析法的特点
传统的《操作系统》教学方式都存在着一系列的弊端。同时,由于操作系统产品设计中的新思想和新方法的不断出现,使操作系统的基本原理和实现技术都发生了不同程度的变化,而教学内容往往相对滞后,跟不上新思想新技术的发展,更谈不上与该领域的最新成果与技术应用同步。这些问题给教学带来了一定的难度。代码剖析法,即在《操作系统》课程的授课过程中结合一个具体操作系统讲授原理并通过剖析其源代码对所讲授的内容进行说明和验证,然后要求学生用自己设计、编写的代码替换其中相应模块或为其扩展功能。
代码剖析法的目标是将操作系统的基本原理与操作系统的具体实例结合起来,以摆脱单纯的阐述工作原理,将十分抽象、枯燥并难以理解的内容变得具体生动。同时学生通过动手编写部分模块或扩展功能,可以进一步深刻了解抽象的原理是如何具体由代码实现的。由于Windows系统源码不公开,Linux系统功能、代码过于复杂,我们选用μC/OS-Ⅱ作为实例进行代码剖析。μC/OS-Ⅱ是一种源码公开、简单、易懂的嵌入式操作系统内核,学生在有限的课程学时内完全可以理解和接受。
4 代码剖析在教学中的应用
μC/OS-Ⅱ是Jean J.Labrosse编写的基于优先级抢占式的实时多任务操作系统,包含了实时内核、任务管理、时间管理、任务间通信与同步(信号量,邮箱,消息队列)和内存管理等功能。μC/OS-Ⅱ具有可固化、可剪裁、高稳定性和可靠性的特点。它的源代码大部分是用C语言编写的,源码完全公开,便于移植和维护,而且对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费。
μC/OS-Ⅱ的核心代码主要包括十几个C源程序文件和一个汇编文件,代码量不是很大,注释详细,特别适合一般使用者的学习、研究。虽然?C/OS-Ⅱ是专门为嵌入式系统应用而设计的操作系统,但它可以在基于PC机的DOS或Windows环境下运行,通过移植也可以不依赖其他操作系统直接运行在PC机上。同时μC/OS-Ⅱ允许使用者自己修改源代码,增加新功能后编译运行,因此初学者可以在自己熟悉的PC环境下进行学习、分析、研究和开发。
在《操作系统》的教学过程中,讲解抽象理论的同时以μC/OS-Ⅱ中对应技术作为案件进行代码剖析,能够使学生直观的接受所学知识,下面举例说明。当讲到进程管理时,进程通讯机制包括互斥信号量、同步信号量、消息队列、信箱等,μC/OS-Ⅱ中分别在 OS_MUTEX.C、OS_SEM.C、OS_Q.C、OS_MBOX.C 等文件中实现,可以通过分析其代码,使学生对所学内容有具体的认识。其中消息传递机制在进程控制块中相关的代码如下:typedef struct os_tcb{
OS_EVENT*OSTCBEventPtr;//指向事件控制块的指针
void*OSTCBMsg;//传递给任务的消息指针
INT8U OSTCBStat;//义任务的状态字
INT8U OSTCBPrio;//任务的优先级 ……}OS_TCB;
事件控制块OS_EVENT中包括:存放指向消息或者消息队列的指针void*OSEventPtr,存放等待消息的任务列表INT8U OSEventTbl[OS_EVENT_TBL_SIZE]等信息。存放一个消息的数据结构代码如下:typedef struct{
void*OSMsg;//指向消息队列中消息的指针
INT16U OSNMsgs;//消息队列中的消息数
INT16U OSQSize;//是消息队列的总的容量
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];
INT8U OSEventGrp;//和 OSEventTbl[]一起结合,是消息队列的等待任务列表}OS_Q_DATA;
发送消息原语Send()由INT8U OSQPost()所实现,代码如下:INT8U OSQPost(OS_EVENT*pevent,void*msg){OS_Q*pq;//定义一个队列事件 ……
*pq->OSQIn++=msg;//插入当前的消息
pq->OSQEntries++;//消息队列数加1
if(pq->OSQIn==pq->OSQEnd){
pq->OSQIn=pq->OSQStart;}
return(OS_NO_ERR);}
接收消息原语Receive()由void*OSQPend()所实现,代码如下:
void*OSQPend(OS_EVENT*pevent,INT16U timeout,INT8U*err){
void*msg;//定义消息队列的指针
OS_Q*pq;//定义一个队列事件
pq=(OS_Q*)pevent->OSEventPtr;//队列指针=当前事件指针if(pq->OSQEntries!=0){
msg=*pq->OSQOut++;//OSQOut将对应的地址的消息复制到msg
pq->OSQEntries--;//队列消息数减1}
……}
学生可以自己编写代码验证消息传递机制的运行情况,或者修改消息机制的功能,例如:
OS_EVENT*MsgQueue;
void*MsgQueueTbl[MSG_QUEUE_SIZE];
void TaskQ(void*pdata){
while(1)OSQPend(MsgQueue,0,&err);}
5 结束语:代码剖析法应用在《操作系统》课程的教学中,突破了传统讲授型教学方法枯燥无味、理论脱离实际的弊端,提高了课堂授课质量。同时突破了传统讲授型教学方法重理论轻实践的缺点,对于学生理解抽象理论,提高综合设计能力有着很好的帮助。
[1]滕艳平,王海珍,潘海珠.高校操作系统课程教学创新模式的研究与实践[J].计算机教育,2009,7 101-103.
[2]申华.师范院校《操作系统原理》课程建设的思考[J].白城师范学院学报,2009,23(3):93-95.
[3]刘金平.浅论互动性在操作系统课程教学中的应用[J].江苏大学学报,2005,27(3):86-88.