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
CCPU资源使用的百分比
PRI优先级
NINice值,负值表示高优先级,正值表示低优先级
ADDR指出程序在内存的哪个部分
SZ使用内存的大小
WCHAN程序是否仍在运行,若为-则正在运行
TTY启动进程的终端名
TIME进程使用CPU的总时间
CMD命令名

2.3 ps aux命令

Ps aux 命令为显示所有用户的进程。由于该命令无法查看父进程的pid,而且数目更加巨大,故只截取了vi进程。
在这里插入图片描述
在这里插入图片描述

参数意义
USER进程拥有者
PID进程id
%CPU上次更新到现在的CPU时间占用百分比
%MEM进程使用的物理内存百分比
VSZ占用的虚拟内存大小
RSS占用的内存大小
TTY终端的次要装置号码
STATD代表不可中断 R代表正在执行 S代表静止状态 T代表暂停执行 Z代表僵死状态
START进程开始的时间
TIME进程占用CPU的时间
COMMAND命令名

2.4 top命令

Top命令经常用于监控linux的系统状况,在这里我们可以看到系统运行时间和平均负载,系统现在进程运行情况,CPU状态,内存状态等信息。

在top运行过程中,我们可以通过其内部命令P,来使所有进程按照CPU占用率排序。

在这里插入图片描述

参数意义
PID进程id
USER进程拥有者
PR优先级
NINice值,负值表示高优先级,正值表示低优先级
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 绪论作业答案(共50分) 一、分析如下程序 (1)~ (10)各语句的频度。(每个1分,共10分) Ex( ) { int i , j , t ; (1) for( i=1 ; i<10 ; i++) //n = (2) printf(“\n %d” , i ); //n = (3) for(i=1; i<=2; i++) //n = (4) printf(“\n”); //n = (5) for(i=1; i<=9; i++) //n = { (6) for(j=1; j <= i ; j++) //n = { (7) t = i * j ; //n = (8) printf(“]”,t); //n = } (9) for(j=1; j 0) { if(x > 100) {x -= 10 ; y -- ;} else x ++ ; } 问if 语句执行了多少次?(2分) y--执行了多少次?(2分) x ++执行了多少次?(2分) 三、回答问题(共25分) 书16页的起泡排序如下: void bubble_sort(int a[],int n){ //将a整数序列重新排列成自小至大有序的整数序列。 for(i=n-1,change=TRUE;i>=1&&change;--i){ change=FALSE; for(j=0;ja[j+1]{a[j]<-->a[j+1];change=TRUE; } } }//bubble_sort 1.(共15分)分析该算法的最佳情况 ,最坏情况和平均情况下各自的时间复杂度(给出分析思路与过程)。 (1) 最佳情况的时间复杂度分析(5分): (2) 最坏情况的时间复杂度分析(5分): (3) 平均情况的时间复杂度分析(5分): 2.(共10分)比较与C语言书的起泡排序异同,并从时空效率角度说明谁更优。 四、完成如下选择题(每3分,共9分)。 1. 设f为原操作,则如下算法的时间复杂度是( )。 for (i = 1; i*i=1;i--) for(j=1;jA[j+1]) A[j]与A[j+1]对换; 其n为正整数,则算法在最坏情况下的时间复杂度为( )。 A.O(n) B.O(nlog2n) C. O(n3) D. O(n2)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值