《Linux操作系统原理——进程操作实验报告》
在软件工程的学习过程中,掌握操作系统的基本原理是至关重要的,特别是对于进程管理的理解。本实验旨在深入理解Linux操作系统中的进程操作,包括进程创建、执行、等待以及退出等基本过程,同时也涉及到了内核模块的编写与使用,以及对系统运行状态的监测。实验环境选用Virtualbox虚拟机搭配Ubuntu操作系统,通过实践来深化理论知识。
实验内容主要分为三个部分:
1. 使用fork(), exec(), wait(), 和 exit()系统调用进行进程操作
实验任务要求在主进程中创建一个子进程,然后在子进程中加载新的任务。主进程需等待子进程退出,并获取子进程的退出状态,该状态应为255。这个任务旨在让学生了解进程间的交互与控制。
2. 利用内核模块访问Linux内核定义的jiffies和HZ值
jiffies是自系统启动以来计时器中断的次数,而HZ是定时器中断的频率。学生需要编写内核模块,在模块加载和卸载时分别输出jiffies的值,然后根据两次jiffies和HZ计算模块在内核中的运行时间,以此理解系统时间的处理机制。
3. 编写、编译并加载Linux内核模块遍历进程控制块(PCB)列表
实验要求将每个进程的PID、状态和可执行文件名输出到内核缓冲区,并统计系统中的进程数量。同时,对比这些信息与使用'ps -el'命令得到的结果,以验证模块功能的正确性。
实验步骤与源代码如下:
任务1:
创建名为task1.c的源文件,包含以下代码:
```c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid < 0) { // 错误处理
perror("Fork failed");
return 1;
} else if (pid == 0) { // 子进程
execlp("/bin/ls", "ls", NULL);
printf("Child failed to execute\n");
exit(255); // 设置退出状态
} else { // 父进程
wait(NULL); // 等待子进程结束
printf("Child's exit status: %d\n", WEXITSTATUS(status)); // 输出退出状态
}
return 0;
}
```
编译并运行task1.c,观察并验证结果。
任务2与任务3则涉及到内核编程,需要学生编写内核模块代码,这通常涉及内核API的使用,如sysfs或procfs接口,以读取jiffies和HZ,以及遍历PCB列表。这部分内容较为复杂,需要对Linux内核有一定的了解,通常在高级操作系统课程中详细讲解。
通过完成上述实验,学生不仅能够掌握基本的进程操作,还能对Linux内核有更深入的认识。此外,对比实验结果与系统命令的输出,可以验证程序的正确性和加深对系统运行的理解。实验的实践性与理论相结合,是学习操作系统原理的重要手段。
评论0