1、掌握 Linux 下的多进程编程技术;
2、通过对进程运行轨迹的跟踪来形象化进程的概念;
3、在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行实际的量化评价,更进一步加深对调度和调度算法的理解,获得能在实际操作系统上对调度算法进行实验数据对比的直接经验。
本操作系统实验的硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口),主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。
1、基于模板 process.c 编写多进程的样本程序,实现如下功能: + 所有子进程都并行运行,每个子进程的实际运行时间一般不超过 30 秒; + 父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出;
2、在 Linux0.11 上实现进程运行轨迹的跟踪。 + 基本任务是在内核中维护一个日志文件 /var/process.log,把从操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一 log 文件中。
3、在修改过的 0.11 上运行样本程序,通过分析 log 文件,统计该程序建立的所有进程的等待时间、完成时间(周转时间)和运行时间,然后计算平均等待时间,平均完成时间和吞吐量。可以自己编写统计程序,也可以使用 python 脚本程序—— stat_log.py(在 /home/teacher/ 目录下) ——进行统计。
4、修改 0.11 进程调度的时间片,然后再运行同样的样本程序,统计同样的时间数据,和原有的情况对比,体会不同时间片带来的差异。
环境准备: cd ~/oslab tar -zxvf hit-oslab-linux-20110823.tar.gz
-C /home/shiyanlou/ 1、 编写样本程序 环境准备:
修改process.c的样本模板,在oslab下新建-zxvf ---process.c
2、 log 文件 对/init/main.c文件做如下修改
3、 写 log 文件 在kernel/printk.c 中添加如下代码实现fprintk()函数
4、 jiffies,滴答 在kernel/sched.c文件中定义为一个全局变量: long volatile jiffies=0;
5、 寻找状态切换点 fork.c文件中函数的修改: 需要修改的函数为copy_process
sched.c文件中的五处修改: (1)在函数 schedule(void)中修改:
(2)在函数sys_pause中修改:
(3)在函数sleep_on中修改:
(4)在函数interruptible_sleep_on中修改:
(5)在函数wake_up中修改:
在/kernel/exit.c中作如下两处修改: do_exit()
sys_waitpid()
挂载hdc sudo ./mount-hdc 将创建的process.c复制到hdc/usr/root下
./run打开模拟器,编译process文件并运行,就可以查看日志文件了,日志文件位置在var/process.log。
gcc -o process process.c ./process
运行sync指令进行同步,将缓冲区信息加载到硬盘。然后关闭模拟器,再次挂载hdc后,进入查看hdc/var/process.log
我们可以用该实验提供的一个用python写的数据统计程序stat_log.py,它从 log 文件读入原始数据,然后计算平均周转时间、平均等待时间等。 如果是实验楼的话就已经自带python解释器了,如果是Ubuntu则执行以下指令下载。 sudo apt-get install python
成功在 Ubuntu 下编写程序,用信号量解决生产者——消费者问题; 在 0.11 中实现信号量,用生产者—消费者程序检验成功。
这次实验让我加深了对进程同步与互斥概念的认识;掌握了信号量的使用,并应用它解决生产者——消费者问题;掌握了信号量的实 现原理,这些对以后的学习很有帮助。
学习时间 68分钟
操作时间 0分钟
按键次数 0次
实验次数 2次
报告字数 3304字
是否完成 完成