1. 操作系统实验之源码分析
1.1 实验目的
- 通过阅读源代码,分析研究linux的进程调度策略和算法
1.2 实验内容
- 完成操作系统的源码分析
1.3 实验步骤
实验步骤:
1.在网站下载linux-2.4.22.tar.gz并解压,其目录结构如图6-1. 其中arch:硬件结构相关代码 kernel:进程调度和管理 mm:内存管理 fs:文件系统 drivers:驱动程序 ipc:进程间通讯 include:头文件,定义内核数据结构 2.下载使用Source Insight 4.0打开查看sched.h的调度函数schedule(),并将全部代码导入如图6-2. 3.进程调度队列的组织如图6-3. 4.三种调度类型(SCHED_FIFO、SCHED_RR、SCHED_OHTER)实现过程如图6-4至图6-6.整体调度流程图如图6-7. 5.优先级如何定义和动态变化如图6-8. 6.时间片的赋值?它与优先级的关系如图6-9. 7.对实时进程和多CPU的支持如图6-10. 8.评价linux的调度策略,提出改进意见如图6-11.
1.4 实验过程

图6-1

图6-2

图6-3

图6-4

图6-5

图6-6

图6-7

图6-8

图6-9

图6-10

图6-11
1.5 心得体会
通过此次实验,我将近花了一周的时间去弄懂操作系统linux-2.4.22内核的代码,由于确实在上万行代码的浏览中有些乏力所以写了大量的注释,参考了部分博客,也查阅了大量的资料,回答了实验六要求的六个问题,并提出自己的改进策略:
在调度函数schedule中,不论是SCHED_FIFO、SCHED_RR还是SCHED_OTHER,在判断结束后都会统一进行判断是否需要重新计算每个进程的时间片,判断的依据是所有正准备进行调度的进程时间片耗尽,这需要对就绪队列中的每一个进程都重新计算时间片,然后返回前面的调度过程,重新在就绪队列当中查找优先级最高的进程执行调度,而除了SCHED_RR用到了时间片外,其余两种调度并未直接使用时间片,所以对此可以将该判断专门放入SCHED_RR调度,对于SCHED_FIFO和SCHED_OTHER就无需操作此步,程序得以加快速度。
让我开心的是,在网上改进的2.6版内核提到了该问题并作出了优化,所以我坚信只要愿意付出,会获得自己想要的收获,努力做到虚壹而静,静心而行。
2. 致读者
虚壹而静,静心而行