操作系统第二次实验进程控制实验报告

实验二: 进程控制

安全1601 16281221 邓子轩

1、打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。

操作系统第二次实验进程控制实验报告

使用ps –ef|gref vi来查看带vi的进程

操作系统第二次实验进程控制实验报告

然后继续使用ps –ef|grep PID来寻找vi的父进程

操作系统第二次实验进程控制实验报告

操作系统第二次实验进程控制实验报告

可以看到搜索父进程顺序为:3408——>3333——>3328——>1774——>1739——>959——>1 

输入命令 pstree -p 查看进程树:

操作系统第二次实验进程控制实验报告

操作系统第二次实验进程控制实验报告

可以看到,从进程树中可以得到相同的结果。

2、编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。

 

依照题意编写程序:

操作系统第二次实验进程控制实验报告

然后使用gcc编译并运行,并使用ps命令查询父进程的运行状况

操作系统第二次实验进程控制实验报告

之后使用top命令查看两个进程的运行状况:

操作系统第二次实验进程控制实验报告

 

图中的参数含义如下:

PID: 进程描述符

USER: 进程的拥有者

PRI:进程的优先级

NI: nice level

SIZE: 进程拥有的内存(包括code segment + data segment + stack segment)

RSS: 物理内存使用

VIRT(virtul memory usage): 进程需要的虚拟内存大小

RES(resident memory usage): 常驻内存

SHARE: 和其他进程共享的物理内存空间

STAT:进程的状态,有 S=sleeping,R=running,T=stopped or traced,D=interruptible sleep(不可中断的睡眠状态),Z=zombie。

%CPU: CPU使用率

%MEM: 物理内存的使用

TIME: 进程占用的总共cpu时间

COMMAND:进程的命令

并且可以看出,父进程和子进程的cpu占用率都是0。

3、使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序和运行状态的变化。

 

操作系统第二次实验进程控制实验报告

代码如下:

操作系统第二次实验进程控制实验报告

操作系统第二次实验进程控制实验报告

运行结果如图

操作系统第二次实验进程控制实验报告

从图中可以看出:

p1的进程号为16919;

p2的进程号为16920,其父进程为16919,即p1;

p3的进程号为16923,其父进程为16919,即p1;

p4的进程号为16921,其父进程为16920,即p2;

p5的进程号为16922,其父进程为16920,即p2;

可以看出输出的顺序为:p1->p2->p4->p5->p3

4、修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(分别采用kill -9 、自己正常退出exit()、段错误退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。

代码如下

操作系统第二次实验进程控制实验报告

运行结果如下:

操作系统第二次实验进程控制实验报告

使用kill-9命令Kill掉p2后会变成如下结果:

操作系统第二次实验进程控制实验报告

可以看出,失去了父进程p2的p4和p5的父进程变成了1485也就是p1的父进程。

使用exit退出会得到如下结果:

操作系统第二次实验进程控制实验报告

若使用段错误的方法,则在程序中插入一个野指针,再运行会变成如下结果:

操作系统第二次实验进程控制实验报告

操作系统第二次实验进程控制实验报告

结果和上面的两种情况相同,p2的两个子进程直接被重新分配了父进程PID,他们的父进程变成了p1的父进程。

Github网址:https://github.com/Qwfjiang/lab2