实验目的
• 掌握 Linux 下的多进程编程技术;
• 通过对进程运行轨迹的跟踪来形象化进程的概念;
• 在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调
度算法进行实际的量化评价,更进一步加深对调度和调度算法的理
解,获得能在实际操作系统上对调度算法进行实验数据对比的直接经验。
实验内容
1. 基于模板“process.c”编写多进程的样本程序,实现如下功能:
i.
所有子进程都并行运行,每个子进程的实际运行时间一般不超
过 30 秒;
ii.
父进程向标准输出打印所有子进程的 id,并在所有子进程都退
出后才退出;
2. 在 Linux 0.11 上实现进程运行轨迹的跟踪。基本任务是在内核中维护
一个日志文件/var/process.log,把从操作系统启动到系统关机过程中
所有进程的运行轨迹都记录在这一 log 文件中。
3. 在修改过的 0.11 上运行样本程序,通过分析 log 文件,统计该程序建
立的所有进程的等待时间、完成时间(周转时间)和运行时间,然后
计算平均等待时间,平均完成时间和吞吐量。可以自己编写统计程
序,也可以使用 python 脚本程序—— stat_log.py ——进行统计。
4. 修改 0.11 进程调度的时间片,然后再运行同样的样本程序,统计同样
的时间数据,和原有的情况对比,体会不同时间片带来的差异。
实验步骤
1、第一步:编写process.c文件
process.c文件的保存路径为~oslab/hdc/usr/root
由于在挂起的虚拟机中无法新建文件,我们需要找一个地方存放编写的process.c文件,然后复制粘贴过去
编写的process.c代码如下
2、日志文件
2.1、修改main.c
使在linux-0.11启动之后,就创建process.log并开始记录
2.2、添加fprintk()函数
2.3、寻找状态切换点
对以下文件进行修改
/kernel/fork.c
/kernel/sched.c文件进行修改
sleep_on()函数
- interruptible_sleep_on()函数
-
schedule()函数
-
wake_up函数()
-
kernel/exit.c do_exit()函数
-
sys_waitpid()函数
-
2.4 测试
使用以下命令,重新编译内核
注意在重新编译内核之前,要确认虚拟机不再被挂起
-
使用以下命令,进入bochs:
-
进入bochs之后,依次输入以下命令
实验结果如图所示:
-
退出bochs ,在终端中将process.log文件复制到oslab文件夹中,就可以直接在宿主机ubuntu上查看log文件
- 统计数据
-
从github上将stat_log.py下载下来,保存在~/oslab/hdc/var/,在ubuntu中断输入以下命令,
实验结果如下图所示:
-
4.修改时间片及测试
- 是在linux-0.11/include/linux/sched.h的宏
-
只需要修改第三个数字即可,即时间片的初始值
例如改成10 ,然后再重新make all ,得到的结果如下图所示
实验总结:
单进程编程是一个进程从上到下顺序进行;多进程编程可以通过并发执行,即多个进程之间交替执行,如某一个进程正在I/O输入输出而不占用CPU时,可以让CPU去执行另外一进程,这需要采用某种调度算法。