内部剖析一个进程

来源:互联网 发布:淘宝拍图动作 编辑:程序博客网 时间:2024/06/15 10:08

主要内容总述:

1、进程优先级问题 ;

2、如何修改一个进程优先级;

3、如何杀死一个进程;

1、进程的优先级 

对于一个进程来说的,不是说这个进程只要处于是R(running)运行状态的话,这个进程就一定正在占用CPU运行。。。

一个进程处于在运行状态,只是表示这个进程当前正处在运行队列,此时的这些进程到底谁可以占用CPU来运行。。。

这就要取决于一个进程的优先级大小了!!!!!!!!

每一个进程在PCB中都有一个用来表示进程运行优先级的表示符,这个优先级可以表示当前的进程何时可以运行和接受CPU运行的时间。。


在上图中、


在一个进程控制块(PCB)中 ,我们使用 PRI来表示当前进程的优先级大小;

另外,对于NI:nice值;我们可以将他理解成是 优先级的修正值,为什么要这么理解呢???

那当然是系统规定:PRI(new)   =    PRI(old)   +    nice;

这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
到目前为止,更需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,
但是进程nice值会影响到进程的优先级变化。

2、如何修改一个进程优先级

对于一个进程的优先级我们是可以改变的,但是要怎么改变呢???
那就要用到上面我们说的NI(nice值)了,我们可以通过改变 NI的值 来改变一个进程的优先级高低。。。。
修改进程NI值(间接的修改优先级)的命令主要有两个:nice,renice

(1)、一开始执行程序就指定nice值:nice

假设我们有这么一个可执行文件要执行     【可执行文件proState】

该结果表示的是  当前权限不够,,,所以这个命令只能在  超级用户下来使用。。。

(2)、调整已存在的进程的nice值 :renice

实现代码示例:
1 renice -5 -p 52002 #PID为5200的进程nice设为-5
实现结果

(3)、也可以用top命令更改已存在进程的nice;

使用方法:
1 top2 #进入top后按“r”–>输入进程PID–>输入nice值

结果演示:

!!!!!!

(4)、对于优先级PRI还有NI的值注意事项 :

一个进程的nice 值 是有范围的,不是我们随便修改的,要是我们随便的修改的话,,那么所有的进程优先级都低的话,那么系统就会忙不过来了。。。。
所以,系统规定    nice值的取值范围是   -20 ~19;
无论你是  修改成200 还是修改成10000,最后得到的nice值都是 19
无论你是  修改成-100还是修改成-1234,最后得到的nice值都是 -20;

3、如何杀死一个进程???

对于一个进程,我们要如何来结束这个进程呢????
下面我们介绍几种方法:

(1)、return  关键字

对于我们写代码的人来说 return  再是熟悉不过了,我们通常用它来返回一个函数的 返回值,也借它来结束一个函数,但是他还可以结束一个进程。
我们平常所写的代码的主函数, 当它开始运行的时候表示 一个进程的开始 , 当它  return 表示的就是这个进程的结束。
所以说return 这个关键字 只能使用在main函数中才能结束一个进程

(2)、exit(int status)、_Exit(int status)、_exit(int status)函数

这三个函数用于正常终止一个程序
_exit和_Exit函数调用后立即进入内核,而exit则要先做一些清理工作(调用执行各终止处理程序,关闭所有标准I/O流),再进入内核。三个函数所带的整型参数称为终止状态或退出状态,系统会将这些状态返回给父进程。。

(3)、atexit函数

这个函数的函数原型:
int atexit( void (*fun)( void ) );
一个进程可以登记若干个(具体自己验证一下)个函数,当进程结束之后,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数可以登记这些函数。exit调用终止处理函数的顺序和atexit登记的顺序相反,如果一个函数被多次登记,也会被多次调用。 
上面这段话的主要意思就是:
 atexit函数 他会 登记 几个函数 (也就是这个函数的参数),当程序结束的时候,exit函数就会调用这些终止函数来处理一些问题;
但是exit调用函数的顺序,与函数参数给的顺序是正好相反的;;;
反正闲着无聊,我们来验证一下吧!!

实现结果:


很明显,,,结论是正确的!!

0 0
原创粉丝点击