操作系统原理与实践-哈工大 实验楼-实验4(进程运行轨迹的跟踪与统计)

实验地址:https://www.lanqiao.cn/courses/115/learning/?id=570
参考文献:https://blog.csdn.net/laoshuyudaohou/article/details/102896611?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

实验内容:
实验内容
实验内容

1、编写样本程序

样本程序,就是一个生成各种进程的程序。
用 fork() 建立若干个同时运行的子进程,父进程等待所有子进程退出后才退出,每个子进程按照你的意愿做不同或相同的 cpuio_bound(),从而完成一个个性化的样本程序。

fork() 函数:
    fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
    fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
        1)在父进程中,fork返回新创建子进程的进程ID;
        2)在子进程中,fork返回0;
        3)如果出现错误,fork返回一个负值;
    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
        “其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.
wait() 系统调用可以让父进程等待子进程的退出。

修改process.c中main函数代码如下:
实验内容
实验内容
运行结果如下:
实验内容

2、Log文件

实验内容
实验内容

3、编写往Log文件中写日志的函数

linux-0.11/kernel/printk.c中添加
实验内容
实验内容
在 include/linux/kernel.h中添加了它的函数定义原形:int fprintk(int fd, const char *fmt, …)
如下图
实验内容

4、jiffies,滴答

jiffies 在 kernel/sched.c 文件中定义为一个全局变量:
long volatile jiffies=0;

它记录了从开机到当前时间的时钟中断发生次数。
时钟中断即每隔指定时间 会发生的一次中断,若设定每隔10ms发送一次时间中断,则jiffies 实际上记录了从开机以来共经过了多少个 10ms。