OS-2019第二次实验

1 打开一个vi进程

1.1 逐步查询

首先我们用ps -C vi命令,即可实现只显示名字为vi的进程。
之后我们利用ps -ef|grep +pid,逐步查询。直到init进程,在这个结果中,第二列为当前进程的pid,第三列为父进程的pid。
OS-2019第二次实验
OS-2019第二次实验
可以看到,通过此方法得到的进程树为2369->2177->2167->1368->1

1.2 进程树查询

OS-2019第二次实验

可以看到。通过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进程及其父进程。
OS-2019第二次实验
OS-2019第二次实验
OS-2019第二次实验
OS-2019第二次实验

参数 意义
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进程。
OS-2019第二次实验
OS-2019第二次实验

参数 意义
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占用率排序。

OS-2019第二次实验

参数 意义
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;
}

OS-2019第二次实验
OS-2019第二次实验

4 采用不同方式终止p2进程

4.1 kill -9

正常运行:
OS-2019第二次实验
利用kill -9终止P2进程后:
OS-2019第二次实验
OS-2019第二次实验
可以看到,在杀掉2125进程后,其子进程2127 2128的父进程变为1356,即p1 p2没有受到影响,p4 p5的父进程发生了变化。
通过ps -al命令我们可以发现,进程2125的运行状态已经变成了Z,即成为一个僵死进程。其他的几个进程也均已进入T 暂停状态。
这是因为kill -9命令是要求程序立刻停止,所以2125成为了一个僵死进程。与之相比,kill -15则允许程序释放相应资源后再停止。

4.2 exit

OS-2019第二次实验
OS-2019第二次实验
OS-2019第二次实验
可以看到,在我们exit 2163进程后, 输出结果同正常运行时一样,进程p1 p2 p3 p4 p5均为受到任何影响。而通过ps-al命令我们可以发现,所有与进程2163有关的进程,均已进入s 即休眠状态。因为exit命令是正常退出一个进程。

4.3 段错误退出

OS-2019第二次实验
OS-2019第二次实验
段错误退出,即发生缓冲区溢出从而导致进程的终止,在这里,我们采用空指针的方式来实现。可以看到,在我们修改源码执行后,程序首先创建了进程14314,其子进程为14315和14316,其中14315的子进程为14317和14318。

在程序接下来的执行过程中,由于发生了段错误,进程14315被关闭,而14315原来的子进程14317和14318,他们的父进程也由14315转变为了1710。通过ps-Al命令可以看到,进程14315处于僵死状态,其他四个进程处于暂停执行状态



本次实验所涉及到的源代码均已存储在本人github,如有需求请查看 https://github.com/16281307/OS/tree/master/lab2