论启发式教学法在计算机专业学生系统能力培养的运用论文

时间:2018-10-05 计算机毕业论文 我要投稿

  引言

  2013 年,教育部计算机科学与技术专业教学指导委员会系统研究组提出要加强学生系统能力培养,明确指出学生的系统能力核心是:“在掌握计算系统基本原理的基础上,熟悉如何进一步开发构建以计算技术为核心的应用系统。”同时建议把计算机专业课程分成三个层次,即:计算机系统基础课程、重组内容的核心课程和侧重不同计算系统的若干相关平台应用课程。操作系统课程被划分到第二层次,是计算机系统能力培养最基本的核心课程。

  操作系统课程具有概念抽象、系统性差、原理性强等特点,教师授课难度较大,学生在学习过程中也往往感到非常抽象和难以理解。要将课程中抽象的原理与具体繁琐的操作系统实现技术有机结合起来,并以比较直观的、易于理解和易于掌握的形式展现,就必须辅以相应的实验。然而,以知识传授为核心的静态实验教学方式(即教师在课堂上把实验原理、目的、步骤及注意事项均详细讲解一遍,学生只需按部就班地操作,用不着查资料,也不需思考实验中还有没有需要改进的地方。)会使学生完全处于被动状态,压抑他们的学习兴趣和主动参与实验的积极性。“启发式”教学法与传统的灌输式教学不同,它更强调学生在教师的引领和启示下,主动参与到发现问题、寻求答案的过程中,从而提高他们独立思考、解决问题的能力。下面以操作系统原理中经典的“生产者-消费者”实验为例,对在实验课中应用“启发式”教学法培养学生的系统能力进行初步探索。

  1 问题描述

  “生产者-消费者”是一个著名的进程同步问题。它描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程和消费者进程能并发执行,在两者之间设置了一个具有n 个缓冲区的缓冲池,生产者进程可以将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。

  “生产者-消费者”实验安排在“经典的进程同步问题”理论课之后。通过学习,学生已经熟悉“生产者-消费者”模型,知道各进程应该互斥地使用缓冲池,且生产者进程和消费者进程之间需要用信号量同步。

  2 组织实施

  为减少学生对教师的依赖,加大他们在实验中的参与度,培养他们的系统能力,我们把“生产者-消费者”实验的组织划分为三个阶段:课前布置任务、课内检查引导、课后收集反馈。

  2.1 课前布置任务

  为加大学生对实验的参与度,我们在实验课前向学生明确实验任务并提供相关API 函数的简单说明,要求学生学习资料并思考“生产者-消费者”模型实现的方法。

  2.1.1 明确实验任务

  在理解“生产者-消费者”模型的基础上,利用多线程技术模拟实现一组生产者和消费者;并假设这些生产者和消费者等效,即:只要缓冲池未满,生产者就可将产品送入缓冲池;只要缓冲池非空,消费者就可以从中取产品进行消费。

  2.1.2 提供学习资料

  由于大多数学生在本次实验前未接触过多线程编程,因此我们向学生提供一些与伪代码中各操作相对应的WindowsAPI。“生产者-消费者”实验涉及到创建生产者与消费者、操作信号量及使用临界资源。我们整理了与之对应的三类函数供学生预习,分别是多线程操作函数、信号量操作函数和互斥量操作函数(通过互斥量保证生产者和消费者对临界资源互斥访问)。多线程操作函数包括创建线程的函数_beginthreadex()和等待多个线程结束的函数WaitForMultipleObject()。信号量操作函数包括创建信号量的函数CreateSemaphore()、申请信号量的函数WaitForSingleObject() 和释放信号量的函数ReleaseSemaphore()。互斥量操作函数包括创建互斥量的函数CreateMutex()、申请互斥量的函数WaitForSingleObject()和释放互斥量的函数ReleaseMutex()。当生产者和消费者完成所有工作后,需要销毁线程、信号量和互斥量等资源。线程、信号量和互斥量都是内核级资源,用CloseHandle()函数销毁。需要注意的是,我们只对上述函数进行简单说明,学生需要借助互联网等资源学习它们的具体使用方法。

  2.1.3 提出具体要求

  提供预习资料的同时要求学生思考:实现“生产者-消费者”模型应考虑哪些技术细节?

  2.2 课内检查引导

  与教师详细讲解实验原理、目的、步骤及注意事项,学生只需按部就班地操作不同,启发式教学法注重发挥学生在实验课上的主动性,积极引导学生思考并对学生的结论进行总结,从而完成实验。本阶段又可分为预习成果检查和总结引导两部分。

  2.2.1 预习成果检查

  实验课开始时我们通过提问检查学生的预习情况,重点考察他们对实验中可能会遇到的技术问题的思考。检查预习的好处在于:一方面,教师的监督可以强迫学生独立思考,减少学生对教师的依赖;另一方面,通过提问教师能够了解学生对实验的理解程度,有助于总结引导。

  2.2.2 总结引导

  根据经验,大部分学生会对实验中可能遇到的技术问题进行思考,但可能不够全面。因此,在听取学生对问题的回答后,应进行总结,并进一步启发学生。我们以共用缓冲池(包含10个缓冲区)的二个生产者和二个消费者为例,实现该“生产者-消费者”模型需要考虑以下三个技术细节。

  ⑴ 该模型使用的数据结构;

  ⑵ 程序的流程;

  ⑶ 实现生产者和消费者的具体操作。

  以上三个技术细节的实现是本实验的关键。学生在课前已经对相关函数进行了预习,因此我们并不立即给出答案,而是启发学生基于预习和已有的编程知识,尝试解决这三个问题。

  问题一:由表1 中伪代码可知,生产者和消费者之间通过信号量同步,并互斥地访问缓冲池。因此,信号量和临界区是实现该模型必不可少的数据结构。

  问题二:程序的流程在main 函数中设定。具体可分为数据结构的初始化、创建多线程和资源回收。其中,资源的初始化及回收可以直接调用相关函数,较为复杂的是创建多线程。讲解创建多线程的方法时可以这样启发学生:每调用一次_beginthreadex()函数可以创建一个线程(用来模拟生产者或消费者),因此,创建多个生产者和消费者要多次调用_beginthreadex(),这种重复执行相同的动作显然要用循环结构,从而引导学生写出创建多线程的语句。创建2 个生产者和2 个消费者的示例代码如下。

  HANDLE thread;

  for(i=0;i<2;i++)

  thread[i]=(HANDLE)_beginthreadex(NULL,0,ProducerFun,

  NULL,0,NULL);

  for(i=2;i<4;i++)

  thread[i]=(HANDLE)_beginthreadex(NULL,0,ConsumerFun,

  NULL,0,NULL);

  WaitForMultipleObjects(4,thread,true,INFINITE);

  上述代码中的ProducerFun 和ConsumerFun 分别是生产者和消费者线程的入口函数,即生产者和消费者将执行的具体操作,需要重点实现。

  问题三:实现生产者和消费者的具体操作,即编程实现函数ProducerFun()和ConsumerFun()。由于生产者和消费者类似,我们以实现ProducerFun()函数为例,启发学生在此基础上独立完成ConsumerFun()函数的编写。

  在本例中,信号量empty 的初始值为10,full 的初始值为0,它们的最大值与缓冲池中缓冲区的个数相同(都为10);互斥量mutex 保证缓冲池被互斥地访问。可根据生产者的伪代码对应写出源程序。

  2.3 课后收集反馈

  学生的课后反馈是对实验课的重要补充。可由课代表收集学生对本次实验的感受和仍存在的疑问,统一反馈给教师。这种反馈能够加强教师和同学之间的联系,帮助教师掌握学生的整体情况,并对教学手段进行改进。在此阶段,可以向编程基础较差的学生提供示例代码,并对其辅导,尽量照顾到各层次的学生。

  3 结束语

  以知识传授为核心的静态实验教学方式要求学生按教师讲解的步骤按部就班进行实验,容易使学生陷于被动,失去对实验课的兴趣。本文针对操作系统课程的特点,提出了适用于操作系统实验课的“启发式”教学方法,并以“生产者-消费者”实验为例,阐述了该方法在教学过程中的应用。经验证,采用启发式教学法能够加大学生在实验课中的参与度,提高学生的独立思考能力,对学生系统能力的培养取得了初步成效。同时,该方法对计算机操作系统课程其他问题及实验的讲解具有一定的借鉴作用。

论启发式教学法在计算机专业学生系统能力培养的运用论文相关推荐