操作系统 实验二 14281020

进程控制

实验内容如下:

根据课堂所学内容和基础知识介绍,完成实验题目。

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

打开一个vi进程

再开一个终端 ps -A命令查看vi的进程号是13240

执行ps -lax,寻找PID为13240的一行,PPID为13232,即父进程的PID。

ps -ef|grep 13232 追踪进程:13240-13232-13222-4602-1

查看进程树 pstree -p 

和pstree比较后一致.

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

使用ps -Al命令
•F代表程序的旗标(flag),4代表使用者为 superuser,1代表user;
•S代表这个程序的状态 (STAT);
•UID代表执行者身份;
•PID代表进程的ID号
•PPID代表父进程的ID;
•C代表使用的CPU资源百分比;
•PRI代表进程的执行优先权(Priority的简写),其值越小越早被执行;
•NI代表进程的nice值,其表示进程可被执行的优先级的修正数值;
•ADDR代表内核函数;
•SZ表示占用内存的大小;
•WCHAN表示这个程序是否正在运作当中,其中’ -’表示正在运作;
•TTY表示登入者的终端机位置;
•TIME表示使用掉的 CPU 时间;
•CMD 表示下达指令的名称;

使用ps aux命令

 USER:该进程属于的使用者账号;
• PID:该进程的进程ID号;
• CPU:该进程使用掉的CPU资源百分比;
• MEM:该进程所占用的物理内存百分比;
• VSZ:该进程使用掉的虚拟内存量 (Kbytes)
• RSS :该进程占用的固定的内存量 (Kbytes)
• TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
• STAT:该程序目前的状态,主要的状态有:
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中;
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie(疆尸) 程序的状态;
• START:该进程被触发启动的时间;
• TIME :该进程实际使用 CPU 运作的时间。
• COMMAND:该进程所属的指令

使用top对cpu占用率排序进行排序

PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。

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

 

执行顺序为:P1->P3->P2->P4->P5

 

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

多次调试后出现 bash:kill :(58844) no such process

p2进程在kill之前就被关闭了。。不太清楚为什么出现这个问题。

exit(0)退出

while (1) 
        {
            printf("node p2 is p1's child and pid %d, parent's pid %d.\n", getpid(), getppid());
Exit(0);//正常退出
        }

p4、p5进程的父进程转为p1的父进程(4062),在进程树上与p1进程是兄弟节点关系,同时p2进程被正常终止。

执行段错误退出:

while (1) 
        {
        printf("node p2 is p1's child and pid %d, parent's pid %d.\n", getpid(), getppid());
         int *p = NULL;
         *p = 0;//通过访问不存在的内存地址,引发段错误退出
}


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值