“操作系统实验”实验报告 进程运行轨迹的跟踪与统计 实验名称:进程运行轨迹的跟踪与统计
实验日期:2022年5月19日
班级:软嵌202
姓名:黄蒙
学号:2030110768
一、 实验目的
掌握 Linux 下的多进程编程技术; 通过对进程运行轨迹的跟踪来形象化进程的概念; 在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行实际的量化评价,更进一步加深对调度和调度算法的理解,获得能在实际操作系统上对调度算法进行实验数据对比的直接经验。
二、实验内容
基于模板 process.c 编写多进程的样本程序,实现如下功能: + 所有子进程都并行运行,每个子进程的实际运行时间一般不超过 30 秒; + 父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出; 在 Linux0.11 上实现进程运行轨迹的跟踪。 + 基本任务是在内核中维护一个日志文件 /var/process.log,把从操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一 log 文件中。 在修改过的 0.11 上运行样本程序,通过分析 log 文件,统计该程序建立的所有进程的等待时间、完成时间(周转时间)和运行时间,然后计算平均等待时间,平均完成时间和吞吐量。可以自己编写统计程序,也可以使用 python 脚本程序—— stat_log.py(在 /home/teacher/ 目录下) ——进行统计。 修改 0.11 进程调度的时间片,然后再运行同样的样本程序,统计同样的时间数据,和原有的情况对比,体会不同时间片带来的差异。
三、 实验过程及数据记录
1.修改process.c文件
2.操作系统启动后先要打开 /var/process.log,然后在每个进程发生状态切换的时候向 log 文件内写入一条记录,其过程和用户态的应用程序没什么两样。然而,因为内核状态的存在,使过程中的很多细节变得完全不一样。log文件 修改main.c文件
3.log 文件将被用来记录进程的状态转移轨迹。所有的状态转移都是在内核进行的。
在内核状态下,write() 功能失效,其原理等同于《系统调用》实验中不能在内核状态调用 printf(),只能调用 printk()。编写可在内核调用的 write() 的难度较大,所以这里直接给出源码。它主要参考了 printk() 和 sys_write() 而写成的:
4.jiffies
jiffries记录了从开机到当前时间的时钟中断的次数,在这时钟中断间隔时间为10ms.寻找状态切换点
本实验中有5个状态,分别是创建(N)、运行(R)、就绪(J)、睡眠(W)、退出(E)。 我们要做的就是在适当的位置插入对应的状态。很显然的,这些状态应该是在创建函数、调度函数、退出函数中。于是应该在 fork.c、sche.c、exit.c文件中添加。
修改sched.c,添加五种状态输出语句
修改exit.c
5.查看process.log信息ugoad
四.实验总结:本次实验加深了我对调度算法的理解和对日志文件的理解。
学习时间 76分钟
操作时间 51分钟
按键次数 1951次
实验次数 2次
报告字数 1914字
是否完成 完成