(一)课程导入(5分钟)
1. 展示生活场景:展示计算机同时运行多个程序(如办公软件、音乐播放器、浏览器)的场景图片或视频,提问学生计算机是如何有条不紊地管理和执行这些程序的,引出进程和线程的概念。
2. 回顾相关知识:简要回顾操作系统的基本功能,如资源管理和任务调度,强调进程和线程在实现这些功能中的重要作用,为后续课程内容的讲解做铺垫。
(二)知识讲解(30分钟)
1. 进程基本概念(10分钟)
进程定义:详细阐述进程的定义,强调进程是程序的一次运行活动,是系统进行资源分配和调度的独立单位。结合生活中的例子,如工厂中的一条生产线(类比进程),它依据特定的生产流程(程序),对原材料(数据集合)进行加工处理,帮助学生理解进程的动态性和独立性。讲解进程分为系统进程和用户进程,对比它们的区别和联系,如系统进程负责操作系统的核心功能,用户进程则用于满足用户的具体需求,且系统进程优先级通常较高。分析进程与程序的联系和区别,通过表格对比的方式,清晰呈现程序的静态性(如存储在磁盘上的可执行文件)和进程的动态性(程序在内存中的运行实例)、程序的永久性(只要文件存在就永久存在)和进程的生命周期性(有创建、运行、结束等阶段),以及一个程序可产生多个进程的特性。介绍可再入程序的概念,以数学库函数为例,说明多个用户可以同时调用该函数,且函数在执行过程中不会修改自身代码,加深学生对可再入程序的理解。讲解进程的特征,结合进程的定义和实际运行情况,逐一分析并发性(多个进程可同时推进)、动态性(进程状态不断变化)、独立性(拥有独立的资源和调度权)、交往性(进程间可能相互作用)、异步性(执行速度不可预知)和结构性(由程序、数据和PCB组成),通过实际案例,如多个进程同时访问共享资源时的并发和异步现象,帮助学生理解这些特征。
进程状态及状态转换:讲解三状态进程模型,展示三状态模型的状态转换图,详细介绍运行、就绪和阻塞三种状态的定义和转换条件。以交通信号灯为例,将进程比作车辆,运行状态如同车辆在道路上行驶(获得CPU执行),就绪状态如同车辆在路口等待绿灯(具备运行条件但未获得CPU),阻塞状态如同车辆因道路施工等原因被临时拦下(等待某事件发生而无法运行),形象地帮助学生理解状态转换的概念。介绍五状态进程模型,在三状态模型的基础上,增加创建状态和结束状态,讲解这两个状态的含义以及五状态模型的状态转换条件。结合进程的创建和结束过程,如一个新程序启动进入创建状态,运行结束后进入结束状态,使学生理解五状态模型更完整地描述了进程的生命周期。
引入七状态进程模型,解释引入该模型的原因是为了区分进程地址空间位于内存还是外存,介绍新增的就绪挂起和阻塞挂起状态,以及七状
态模型的状态转换条件。通过对比不同状态模型,帮助学生理解七状态模型在内存管理和进程调度方面的优势。
进程控制块:讲解进程控制块(PCB)的概念和作用,强调PCB是进程存在的唯一标志,系统通过PCB对进程进行控制和管理。类比酒店的入住登记系统(PCB),每个客人(进程)入住时都需要登记信息,酒店通过这些登记信息管理客人的住宿安排,帮助学生理解PCB对进程管理的重要性。介绍PCB的内容,分为调度信息(如进程名、优先级、当前状态等)和现场信息(如程序状态字、时钟等),解释这些信息在进程调度和运行状态恢复中的作用。结合进程的创建和撤销过程,说明系统如何创建和回收PCB,以及PCB在进程状态转换中的作用。讲解PCB的组织方式,包括线性方式、索引方式和链接方式,分析每种方式的优缺点。以图书馆的图书管理为例,线性方式如同将所有图书随意摆放,查找特定图书需要遍历整个书架(查找PCB效率低);索引方式如同按照图书类别建立索引,查找特定类别的图书更方便(按状态查找PCB效率高);链接方式则像用链条将同一类别的图书连接起来,便于按顺序查找(适合队列式的PCB管理)。介绍进程队列的概念,包括就绪队列、等待队列和运行队列,以及队列的组成方式(单向链接和双向链接)。通过实际的进程调度场景,如就绪队列中的进程等待调度执行,等待队列中的进程因等待事件而暂停,帮助学生理解进程队列在进程管理中的作用。
2. 进程控制(7分钟)
进程控制原语:讲解进程控制的概念,强调进程控制是对进程在整个生命周期中各种状态之间的转换进行有效控制。介绍进程控制原语的概念,原语是具有不可分割性的指令序列,用于实现特定的操作功能,且必须在管态下执行并常驻内存。结合实际的进程管理需求,讲解用于进程控制的原语,如创建进程(类比工厂招聘新工人开启新生产线)、撤销进程(关闭生产线并清理资源)、挂起进程(暂停生产线)、激活进程(重新启动暂停的生产线)、阻塞进程(因原材料不足暂停生产线)、唤醒进程(原材料到位后恢复生产线)以及改变进程优先级(调整生产线的生产优先级)等原语的功能和实现机制。通过动画演示或流程图的方式,展示这些原语如何改变进程的状态和资源分配,帮助学生理解进程控制的过程。
Linux操作系统有关进程控制的系统调用:介绍Linux操作系统中常用的进程控制的系统调用,如fork、exec、wait、exit、getpid、sleep和nice等,讲解每个系统调用的功能。结合实际的Linux编程场景,通过代码示例演示这些系统调用的使用方法。例如,使用fork创建子进程,展示父进程和子进程的执行流程;使用exec更换进程映像,实现程序的替换执行;使用wait让父进程等待子进程完成任务等。在演示过程中,详细解释代码的逻辑和执行结果,帮助学生理解系统调用在进程控制中的实际应用。
3. 线程引入及基本概念(7分钟)
线程的引入:讲解引入线程的原因,分析进程活动存在的资源开销,如创建和切换进程时的时间和空间开销,说明为了使多个程序更好地并
发执行并减少系统开销,需要分离调度的基本单位和独立分配资源的单位,从而引入线程的概念。以一个大型项目的团队协作(类比进程)为例,每个小组(类比线程)可以独立完成部分任务,且小组之间切换任务的开销较小,提高了整个项目的执行效率,帮助学生理解线程的引入意义。介绍线程的定义,强调线程是进程中的一个实体,是CPU调度和分派的基本单位,只拥有少量运行必不可少的资源,同属一个进程的线程共享进程的全部资源。结合多线程应用场景,如浏览器同时加载多个网页(每个网页加载可看作一个线程),说明线程的特点和作用。讲解线程的属性,包括唯一的标识符、线程描述表、共享进程内存地址空间、独立调度和并发执行、状态变化等,通过对比线程和进程的属性,帮助学生理解线程的特性。例如,线程的标识符用于唯一标识线程,线程描述表记录线程的运行状态,如同进程控制块记录进程的状态;线程共享进程的内存地址空间,而进程之间的内存空间是独立的。介绍引入线程的好处,如创建线程速度快、切换开销小、通信简便、能充分利用处理器与外部设备并行工作能力等。通过实际的多线程程序性能对比,展示线程在提高系统并发性能方面的优势,如多线程的文件下载程序比单线程下载速度更快。
线程的组成:讲解线程的组成部分,即线程控制块(thread结构),包括唯一的线程标识符、描述处理器工作情况的寄存器内容、两个栈指针(核心栈和用户栈)和私有存储区。结合线程的运行过程,解释这些组成部分的作用。例如,线程标识符用于区分不同线程,寄存器内容保存线程的运行状态,栈指针用于管理线程的堆栈空间,私有存储区用于保存线程的局部数据和现场保护信息。通过类比进程控制块的结构和作用,帮助学生理解线程控制块对线程的管理和控制作用。
线程与进程的关系:讲解线程又称为轻量级进程或进程元,传统进程称为重量级进程,通常一个进程包含多个线程。从调度、并发性、资源拥有和系统开销等方面详细对比线程和进程的关系。以表格形式呈现对比结果,如在调度方面,线程作为调度和分派的基本单位,进程作为资源拥有的基本单位;在并发性方面,线程之间和进程之间都可以并发执行,但线程的并发性更强;在资源拥有方面,进程是拥有资源的独立单位,线程共享进程的资源;在系统开销方面,创建和撤销线程的开销小于进程,进程切换的开销大于线程切换的开销。通过实际案例分析,如多线程服务器程序和多进程服务器程序的性能对比,帮助学生深入理解线程和进程的关系。
4. 线程的实现和实例(6分钟)
线程的实现方式:介绍线程的实现方式,包括用户级线程、核心级线程和混合方式。讲解用户级线程的实现方式,强调其创建、撤销和切换都不利用系统调用,由应用程序自行管理,每个进程有私有的线程表。以数据库系统中的线程为例,说明用户级线程的应用场景和特点。分析用户级线程的优缺点,优点如切换速度快、可采用自定义调度算法、可运行在任何操作系统上;缺点如一个线程执行系统调用时同一进程内所有线程被阻塞、多线程应用程序无法充分利用多处理器优势等。通过实际的用户级线程应用场景,如Web服务器中的线程管理,帮助学生理解用户级线程的优缺点。讲解核心级线程的实现方式,强调其创建、撤销和切换都由核心实现,核心保留线程控制块并进行调度。以操作系统内核中的线程管理为例,说明核心级线程的实现机制和特点。分析核心级线程的优缺点,优点如能真正实现并行操作、一个线程阻塞时可调度同进程的其他线程、核心线程本身可多线程;缺点如控制转移开销大、应用进程无法影响线程切换等。通过对比用户级线程和核心级线程的优缺点,帮助学生理解两种实现方式的差异和适用场景。介绍混合方式,即同时实现用户级线程和核心级线程,讲解其结合了两者的优点,如同一进程内的多个线程可在多个处理器上并行运行、阻塞式系统调用不必阻塞整个进程、线程创建在用户空间完成而调度在核心态完成等。通过实际的操作系统案例,如Solaris操作系统的线程管理,帮助学生理解混合方式的优势和应用。对三种线程实现方式在调度与切换速度、系统调用、线程执行时间等方面进行比较,以表格形式呈现比较结果,帮助学生清晰分辨不同实现方式的特点。
Pthread线程包:介绍Pthread(POSIX thread)库,强调它是编写多线程应用程序的一组用户级程序库,所有线程映射到一个单独的内核级进程中。讲解Pthread线程的共有特性,如标识符、寄存器、属性等,以及主要的Pthread函数调用,如pthread_create()(创建新线程)、pthread_join()(等待特定线程退出)、pthread_exit()(结束调用的线程)、pthread_yield()(释放CPU运行其他线程)、pthread_attr_init()(创建并初始化线程)、pthread_attr_destroy()(删除线程属性结构)等。通过实际的代码示例,演示Pthread线程包的使用方法,如创建多个线程并让它们并发执行,展示多线程程序的编写和运行过程。在演示过程中,详细解释代码的逻辑和每个函数的作用,帮助学生掌握Pthread线程包的应用。
协程:讲解协程的概念,提出当线程数量过多时会占用大量内存空间和系统时间,协程作为解决方法应运而生。强调协程是运行在线程之上的轻量级线程,通过分时复用的方式在同一线程上运行多个协程,且协程的切换在用户态完成,代价较小。以一个简单的网络爬虫程序为例,使用协程可以在一个线程内高效地处理多个网页的抓取任务,帮助学生理解协程的概念和优势。
(三)课堂讨论(5分钟)
1. 提出问题:提出具有启发性和讨论价值的问题,如“在多线程编程中,如何避免线程安全问题?”“结合实际应用场景,分析用户级线程和核心级线程的适用情况。”“在Linux系统中,fork和exec系统调用的配合使用有哪些实际应用场景?”等。
2. 组织讨论:将学生分成小组进行讨论,鼓励学生积极发表观点,分享自己的理解和想法。教师在各小组间巡视,参与讨论,适时给予引导和启发,帮助学生拓展思路,深入分析问题。
3. 总结点评:各小组代表发言,分享小组讨论结果。教师对各小组的讨论情况进行总结和点评,肯定学生的正确观点,纠正错误认识,补充完善知识点,进一步加深学生对进程线程相关知识的理解和应用能力。例如,在讨论线程安全问题时,引导学生思考如何使用互斥锁、信号量等同步机制来保证线程安全;在分析用户级线程和核心级线程的适用情况时,结合具体的应用场景,如高并发的Web服务器和对实时性要求较高的控制系统,帮助学生理解不同线程实现方式的选择依据。
(四)课堂总结(3分钟)
1. 知识回顾:结合PPT或板书,与学生一起回顾本节课所学的重点知识,包括进程的定义、组成、状态转换、控制原语和系统调用,线程的引入、组成、与进程的关系、实现方式和Pthread线程包,以及协程的概念等。以思维导图的形式呈现知识框架,帮助学生梳理知识点之间的联系,加深记忆。
2. 强调重点:强调本节课的重点和难点内容,如进程状态转换的条件和过程、进程控制原语的实现机制、线程与进程关系的深入理解、不同线程实现方式的优缺点比较、Pthread线程包的使用等,提醒学生在课后复习时重点关注。对学生在课堂上的表现进行总结和鼓励,激发学生继续学习操作系统相关知识的积极性。
(五)课后作业(2分钟)
1. 书面作业:布置书面作业,要求学生完成PPT中的复习题,通过书面作业巩固本节课所学的知识点,加深对进程线程概念、原理和应用的理解。
例如,让学生分析给定进程状态转换图中的状态变化原因,解释进程控制原语的执行过程,对比线程和进程在不同方面的差异等。
2. 实践作业:布置实践作业,让学生使用Pthread线程包编写一个多线程程序,实现多个线程并发执行特定任务,并处理线程同步问题。例如,编写一个多线程的文件读取程序,多个线程同时读取一个大文件的不同部分,最后合并读取结果;或者编写一个多线程的计算程序,多个线程并行计算一个复杂的数学问题,提高计算效率。要求学生提交代码和运行结果,并在代码中添加详细的注释,解释程序的功能和实现思路,培养学生的实践能力和编程素养。