基于Linux内核的操作系统进程调度教学方法研究

时间:2023-04-29 13:30:09 公文范文 来源:网友投稿

摘要:进程管理是操作系统课程的核心,而进程调度是进程管理理论的教学重点.如果不能将理论与真实操作系统相结合,学生很难掌握各种调度算法的应用背景和运行原理.笔者通过剖析Linux内核源码,采用探索启发式教学方法,引入进程调度应用于Linux操作系统的真实案例,使学生真切感知实际操作系统中进程调度的运行机理.并且通过修改内核源代码改进调度算法,使学生加强对调度算法理论的深入理解,从而提高学生对操作系统课程学习的积极性及分析解决问题的能力.

关键词:操作系统;进程调度;Linux内核;教学方法

中图分类号:G642.0  文献标识码:A  文章编号:1673-260X(2019)01-0063-03

1 引言

操作系统是计算机科学与技术专业的专业核心课,该课程对其他专业课程起着承上启下的作用.课程主要内容涵盖进程管理、进程调度与死锁、存储器管理、设备管理、文件管理、操作系统接口等[1].由于操作系统课程理论性强,知识点庞杂从而导致学生对本门课程的学习热情明显不高.基于此,笔者尝试通过剖析Linux内核源码去阐述进程调度的运行机制[2],采用探索启发式教学方法,让学生充分感知真实操作系统软件的设计思路,真正让理论落地于实际,从而提高学生对操作系统课程的学习热情.

在Linux内核版本的选择上,最新稳定版(4.15.15)由于代码量太过庞大(1400万行)[3],学生很难梳理其架构与脉络,对代码剖析更是无从下手,由此产生了畏惧和排斥.0.11版发行于20世纪90年代,虽年代久远但具备了现代操作系统的基本功能,如多用户多任务、中断并发、同步互斥等,而代码量也只有一万四千行(不包含注释).为了深入理解进程调度算法以及增强学生对内核源码解读的代入感,笔者最终选择0.11版Linux内核作为操作系统课程的教学资源.

针对课程设置,笔者结合多年的操作系统教学经验,将进程调度教学环节规划为四大部分:一、进程调度概述,让学生对进程调度概念有一个大致的了解;二、进程调度步骤宏观解读,通过引入Linux实例展示其进程调度的基本步骤;三、进程调度机制微观探索,通过分析schedule函数源代码,让同学了解真实操作系统中进程调度算法的核心内容;四、调度算法优化实践,通过改进源代码,提升操作系统内核多进程调度质量,使学生对进程调度算法的解读得到升华.

2 进程调度概述

进程调度的基本内容,包括进程调度的基本概念、进程调度的目标、进程调度算法以及各种算法的应用场景.进程调度的主要算法有:先来先服务算法、短作业优先算法、静/动态优先级算法、时间片轮转法等.评估算法的指标有CPU的运行效率、进程运行公平性、响应及时性、内存吞吐量等几方面因素.

上述提及的这些目标不可兼备,在讲授这些指标性能取舍问题时,笔者利用各种真实操作系统进行列举,如UNIX采用动态优先数调度、BSD采用多级反馈队列调度、Windows采用抢先式多任务调度等[4].通过举例,让学生对调度算法不同的应用场景有一个感性的认识.

3 进程调度步骤宏观解读

为了让同学了解0.11版Linux内核进程调度的运行机理,在宏观上笔者基于主要源文件对进程调度的步骤进行解读,如图1所示:

通过此结构图,学生可以了解到主程序文件(main.c)对进程调度进行了初始化操作,即执行shed_init()函数.而调用的sched_init()函数来自进程调度程序文件(sched.c),此时笔者要强调sched.c文件的重要作用,因为这是进程调度的核心.同时,作为进程调度的依据,进程控制块PCB源自头文件sched.h中的task_struct结构体.操作系统利用中断使用户态切换至内核态,因此要设置中断门(set_intr_gate),执行时钟中断处理指令(_timer_interrupt).在中断处理指令中调用了do_timer函数,此函数执行时间片轮转.最后,利用sched.c文件中的进程调度函数schedule(),引出进程调度的核心算法.

经过以上步骤的解读,学生大致了解了0.11版Linux内核进程调度的基本流程,即操作系统通过时间片时钟中断语句,以进程调度算法为依据对下一个进程进行调度处理.

4 进程调度机制微观探索

进程调度的实现应具备三个基本机制,分别是进程队列,进程分派程序和上下文切换机制[5].笔者分别针对三大模块实现的核心代码,引导学生进行逐层剖析.

4.1 进程队列

首先将调度进程头文件sched.h作为切入点,此文件主要包含进程控制块task_struct结构体.而进程队列的实现是由结构体数组构成,通过刚才提及的进程调度核心文件sched.c中第65行代码可以进行例证,核心代码如下:

struct task_struct *task[NR_TASKS];

4.2 进程分派程序

进程分派的核心是选择进程,而选择的依据是task_struct结构体,涉及counter和priority两个元素,分别表示任务运行时间片和运行优先数.当定义好结构体后,程序又以宏定义的方式对结构体元素进行了初始化操作(#define INIT_TASK),其中counter和priority的初始值都设置为15.基于以上的描述,学生意识到0.11版Linux内核对每个新进程都以相同的时间片和优先数进行初始化配置.

其次,要深入解读sched.c文件的scedule()函数,这是进程调度的核心.这部分代码根据进程的时间片和优先权调度机制,来选择随后要执行的任务.它首先循环检查进程控制块数组中的所有进程,根据每个就绪态任务剩余执行时间的值counter,选取该值最大的一个任务,并利用switch_to()函数切换到该任务[6].核心代码如下:

每當选择出一个新的可运行进程时,schedule()函数就会调用定义在include/asm/system.h中的switch_to()宏执行实际进程切换操作.该宏利用汇编语句把CPU的当前进程状态(上下文)替换成新进程的状态.笔者通过图的方式对其过程进行了解读,学生对操作系统控制CPU进行进程切换有了直观的认识,如图2所示:

5 调度算法优化实践

现代分时操作系统中,目前公认的一种较好的进程调度算法是采取多级反馈队列调度算法,如图3所示.

基于此,笔者优化了0.11版Linux内核调度算法,即将授课过程中涉及的程序文件进行代码修改,并编译运行内核,达到进程调度的预期效果.在此教学过程中,学生们即感受到多级反馈调度的优势,也加强了解读内核源代码的能力.

6 小结

进程调度是操作系统课程的重点和难点,笔者尝试通过解读Linux内核源代码,并运用探索启发式教学方法,让学生生动理解操作系统进程调度的过程.在操作系统课程体系的其他环节,也可以尝试引入Linux内核源代码作为教学参考资料,真正做到理论联系实际,从而提高学生主动实践、积极探索、终身学习的能力.

参考文献:

〔1〕罗娇敏.操作系统进程同步和互斥教学方法研究[J].教育教学论坛,2017(44):255-256.

〔2〕吴淑泉.高校“Linux操作系统”课程教学研究与探索[J].教育理论与实践,2017(33):57-58.

〔3〕Latest Stable Kernel.[EB/OL].https://www.kernel.org/pub.

〔4〕陈莉君,康华.Linux操作系统原理与应用(第2版)[M].北京:清华大学出版社,2016.64-65.

〔5〕汤小丹,梁红兵.计算机操作系统(第3版)[M].陕西:西安电子科技大学出版社,2012.86-87.

〔6〕赵炯.Linux内核完全注释[M].北京:机械工业出版社,2017.92-97.

〔7〕赵炯.Linux内核完全剖析[M].北京:机械工业出版社,2017.130.

推荐访问:教学方法 调度 内核 进程 操作系统