内部剖析一个进程
来源:互联网 发布:淘宝拍图动作 编辑:程序博客网 时间: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
- 内部剖析一个进程
- 推荐一个线程进程(内部)通信框架--ThreadMessaging.NET
- Memcache内部剖析
- st_mode 内部剖析
- Memcache内部剖析
- 读《Android内部剖析》
- tomcat内部剖析
- 电脑内部剖析
- 从核心模式启动一个进程----怎样从内部的驱动程序启动一个Win32进程
- SDWebImage内部实现原理剖析
- Spark Scheduler内部原理剖析
- 内部启动进程(dos)
- windows进程内部信息
- Linux 进程管理剖析
- Linux 进程管理剖析
- Linux 进程管理剖析
- Linux 进程管理剖析
- Csrss进程剖析
- 【JDK动态代理】
- JavaScript中的变量
- Django 创建超级用户
- Oil Deposits UVA
- java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String 解决
- 内部剖析一个进程
- 火狐新标签页更改背景 Changing Firefox Background
- 总结android中的.gradle文件写法及含义
- 建造者模式
- Python中range()函数和list比较
- 最大的Redis集群:新浪Redis集群揭秘
- Android Studio 项目引入一个别的项目中写好的Library
- javamail技术smtp发送邮件
- Maven 仓库地址