OS-2019第二次实验
操作系统实验二
1 打开一个vi进程
1.1 逐步查询
首先我们用ps -C vi命令,即可实现只显示名字为vi的进程。
之后我们利用ps -ef|grep +pid,逐步查询。直到init进程,在这个结果中,第二列为当前进程的pid,第三列为父进程的pid。
可以看到,通过此方法得到的进程树为2369->2177->2167->1368->1
1.2 进程树查询
可以看到。通过pstree命令得到的进程树依然为2369->2177->2167->1368->1
2 编写程序,首先使用fork系统调用,创建子进程
2.1 程序代码
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid=fork();
if(pid<0)
printf("file\n");//创建失败
else if(pid==0)//子进程
{
execl("/usr/bin/vi","vi",NULL);
}
else//父进程
{
while(1)
{
}
}
return 0;
}
2.2 ps -Al命令
Ps-Al命令为列出所有的进程,但由于进程数目太多,故只截取了vi进程及其父进程。
参数 | 意义 |
---|---|
F | 程序的flag,4代表root |
S | 程序的运行状态 |
UID | 用户id |
PID | 进程id |
PPID | 当前进程的父进程id |
C | CPU资源使用的百分比 |
PRI | 优先级 |
NI | Nice值,负值表示高优先级,正值表示低优先级 |
ADDR | 指出程序在内存的哪个部分 |
SZ | 使用内存的大小 |
WCHAN | 程序是否仍在运行,若为-则正在运行 |
TTY | 启动进程的终端名 |
TIME | 进程使用CPU的总时间 |
CMD | 命令名 |
2.3 ps aux命令
Ps aux 命令为显示所有用户的进程。由于该命令无法查看父进程的pid,而且数目更加巨大,故只截取了vi进程。
参数 | 意义 |
---|---|
USER | 进程拥有者 |
PID | 进程id |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
VSZ | 占用的虚拟内存大小 |
RSS | 占用的内存大小 |
TTY | 终端的次要装置号码 |
STAT | D代表不可中断 R代表正在执行 S代表静止状态 T代表暂停执行 Z代表僵死状态 |
START | 进程开始的时间 |
TIME | 进程占用CPU的时间 |
COMMAND | 命令名 |
2.4 top命令
Top命令经常用于监控linux的系统状况,在这里我们可以看到系统运行时间和平均负载,系统现在进程运行情况,CPU状态,内存状态等信息。
在top运行过程中,我们可以通过其内部命令P,来使所有进程按照CPU占用率排序。
参数 | 意义 |
---|---|
PID | 进程id |
USER | 进程拥有者 |
PR | 优先级 |
NI | Nice值,负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量 |
RES | 进程使用的、未被换出的物理内存的大小 |
SHR | 共享内存大小 |
S | 进程状态 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMOND | 命令名 |
3 使用fork系统调用,创建如下进程树
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t p1;
pid_t p2;
p1=fork();
p2=fork();
if(p1==0&&p2>0)
{
fork();
}
printf("parend pid is %d and child pid is %d\n",getppid(),getpid());
while(1);
return 0;
}
4 采用不同方式终止p2进程
4.1 kill -9
正常运行:
利用kill -9终止P2进程后:
可以看到,在杀掉2125进程后,其子进程2127 2128的父进程变为1356,即p1 p2没有受到影响,p4 p5的父进程发生了变化。
通过ps -al命令我们可以发现,进程2125的运行状态已经变成了Z,即成为一个僵死进程。其他的几个进程也均已进入T 暂停状态。
这是因为kill -9命令是要求程序立刻停止,所以2125成为了一个僵死进程。与之相比,kill -15则允许程序释放相应资源后再停止。
4.2 exit
可以看到,在我们exit 2163进程后, 输出结果同正常运行时一样,进程p1 p2 p3 p4 p5均为受到任何影响。而通过ps-al命令我们可以发现,所有与进程2163有关的进程,均已进入s 即休眠状态。因为exit命令是正常退出一个进程。
4.3 段错误退出
段错误退出,即发生缓冲区溢出从而导致进程的终止,在这里,我们采用空指针的方式来实现。可以看到,在我们修改源码执行后,程序首先创建了进程14314,其子进程为14315和14316,其中14315的子进程为14317和14318。
在程序接下来的执行过程中,由于发生了段错误,进程14315被关闭,而14315原来的子进程14317和14318,他们的父进程也由14315转变为了1710。通过ps-Al命令可以看到,进程14315处于僵死状态,其他四个进程处于暂停执行状态
本次实验所涉及到的源代码均已存储在本人github,如有需求请查看 https://github.com/16281307/OS/tree/master/lab2