进程运行轨迹的跟踪和统计(实验4)
根据哈工大课程cup管理章节,为了使cpu被充分利用,因此引进了多进程的概念,一个进程在等待io命令时,此时,我们就将该进程挂起,执行其他进程,cpu通过PCB控制进程,而进程等待队列又分为就绪队列和阻塞队列。这次的实验目的为:跟踪进程的运行轨迹和统计
- log文件
log文件主要是用来保存进程发生状态切换时的记录,文件目录为/var/process.log
该实验为了尽快打开log文件,在init/main.c
中的main()
函数中,将init()
函数中的一部分代码搬到main()
函数中。
move_to_user_mode();
move_to_user_mode();
// ……
//加载文件系统
setup((void *) &drive_info);
// 打开/dev/tty0,建立文件描述符0和/dev/tty0的关联
(void) open("/dev/tty0",O_RDWR,0);
// 让文件描述符1也和/dev/tty0关联
(void) dup(0);
// 让文件描述符2也和/dev/tty0关联
(void) dup(0);
if (!fork())
{
/* we count on this going ok */
init();
}
这段代码建立了文件描述符 0、1 和 2,它们分别就是 stdin、stdout 和 stderr。这三者的值是系统标准(Windows 也是如此),不可改变。
可以把 log 文件的描述符关联到 3。文件系统初始化,描述符 0、1 和 2 关联之后,才能打开 log 文件,开始记录进程的运行轨迹。
为了能尽早访问 log 文件,我们要让上述工作在进程 0 中就完成。所以把这一段代码从 init() 移动到 main() 中,放在 move_to_user_mode() 之后(不能再靠前了),同时加上打开 log 文件的代码。
2.写log文件
写log文件之前,我们需要在printk.c文件中加入fprintk()函数的实现代码,因为在内核状态下,无法使用printf();
#include "linux/sched.h"
#include "sys/stat.h"
static char logbuf[1024];
int fprintk(int fd, const char *fmt, ...)
{
va_list args;
int count;
struct file * file;
struct m_inode * inode;
va_start(args, fmt);
count=vsprintf(logbuf, fmt, ar