1. 前言
本篇文章的两种进程状态:
僵尸进程和孤儿进程是对上篇文章的补充
进程优先级在整个进程的学习中并不是
很重要,但是需要它为后面的知识做铺垫
本章重点:
本篇文章着重讲解什么是僵尸进程?
僵尸进程是怎样形成的?僵尸进程的危害
以及孤儿进程的形成原因和OS的解决方法
最后讲解进程优先级相关内容,包括PRI
和NI
值得含义,Linux下得优先级范围
2. 什么是僵尸进程?
在上一篇文章我们知道Linux中
具体有以下几种进程状态:
僵尸状态本质是就是死亡状态
当一个正常人死亡时,警察不可能直接
将人拖到火葬场火化,而是要确认此人
是自杀还是它杀还是自然死亡,还需要
给整个社会一个交代!Linux中得进程也是
如此,当一个进程死亡时不会立刻销毁
而是会处理一些后事!
我们创建一个进程得目的是为了完成
某种任务,但是你怎么知道我把任务
完成得怎么样了?所以进程在退出时需
返回一些退出信息来表示任务完成得如何!
比如写C/C++代码时的return0:
int main() { return 0; //return 1; //return 2; //return 3; }
返回0表示程序正常执行,程序也可以返回1.2.3
现在可以初步得出结论:
当进程退出但是还没处理完后事时
此时处于僵尸状态
3. 变成僵尸状态的具体过程
由上所述你怎么知道我把任务完成得怎么样?
的我当然是退出进程,那么你指的是什么?
答案是退出进程的父进程
事实上,要让父进程读取到退出PCB
中的退出信息,得知子进程退出的原因
此时才能释放退出进程的PCB!
此时我们就得到了僵尸状态的确定定义:
当一个进程退出了,但是退出信息还没
被父进程读取,此时操作系统必然会维护
这个退出进程的PCB结构不被释放,此时
这个退出进程就处于僵尸状态(Z)
若一个进程长期处于Z状态,不及时 回收,此时会有内存泄漏的风险!
我们可以通过下面的代码来观察僵尸状态:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include<stdlib.h> int main() { int id=fork(); if(id==1) { sleep(1); exit(2); } if(id>1) { while(1) { sleep(1); printf("hello hdu,%d\n",getpid()); } } return 0; }
查看进程的Z状态
4. 什么是孤儿进程?
其实听这个名字就知道,孤儿进程
大概率就是父进程挂掉了的进程
孤儿进程定义:
当一个子进程还没有退出,而父进程
先退出了,这个子进程被称为孤儿进程
当一个进程称为孤儿进程了,意味着
没有父进程为他:“收尸"了,不回收就会
占用操作系统的资源,最终使得操作系统
崩溃!所以操作系统会让孤儿进程找
一个"干爹"充当父进程为它"收尸”
细心的同学可能会在实践中发现
孤儿进程全部被1号进程统一领养了然而这个1号进程实际上就是操作系统本身!
5. 什么是进程优先级?
cpu资源分配的先后顺序
就是指进程的优先级(priority)
先区分优先级和权限的区别:
- 优先级代表一定能得到申请的资源
只是现在要考虑得到资源的时间问题 - 权限代表有没有资格得到申请的资源
是要考虑能否的问题
查看进程的优先级:
使用指令:
ps -l
或ps -al
在这个图中我们只需要关心两个信息:
PRI:
进程优先级,值越小,优先级越高NI:
优先级的修正数据(nice值)
干货直诉:
在Linux操作系统中,进程的默认优先级
都是80,并且Linux中进程的优先级取值
范围是:60~99,进程真正的优先级和上面
对应的PRI与NI的关系可以总结如下:
6. 怎么修改进程优先级?
使用一连串指令修改指定进程的优先级:
- 输入top启动任务管理器
- 输入r(renice)来修改NI的值
- 再输入目标进程的pid来定位
- 输入想要修改的NI值(注意不是输入PRI值)
注:系统允许优先级的值被改高
如果想要将值改低要用sudo或root账号
请看以下视频观察情况:
修改进程的优先级
由于Linux下的优先级取值范围是
60 ~ 99,所以NI的取值范围是 -20 ~ 19
一共40个等级,当输入的NI值小于-20时
系统会自动将NI变成-20,当输入的NI值
大于19时,系统会自动将NI变成19!
其实修改进程的优先级不止一种方法
这里只讲解了我认为最方便的一种方式
想要了解其他修改方法大可百度!
7. 为什么优先级不能随意修改?
你可能会有疑惑,为啥修改优先级
要有一共范围,不能无下限无上限的修改?
这是因为:
操作系统在调度进程时,需要较为
均衡的让每一个进程都要得到调度
如果用户无下限的修改优先级,会导致
优先级较低的进程长时间得不到CPU
的资源,会造成:进程饥饿
所以我们要有一个概念:
当一个进程被放在CPU上处理时,
并不是一直在CPU上,过段时间后
操作系统会它取下来放入其他进程!
所以在一秒内,n个进程可能就已经
被调度成百上千次了!
其他概念:下一篇文章详讲:
8. 总结以及拓展
本篇文章主要是对上一篇文章
的进程状态做一个补充了断,并且
讲解了进程优先级相关内容,为后面
的Linux进程学习打上基础!
希望我的文章对你有帮助,谢谢你的阅读!
拓展阅读:修改优先级的其他方法: