僵尸进程
僵尸状态进程本质上就是死亡状态
在进程死亡之后,不会直接对进程进行释放,而是先会处理一些后事
进程在结束退出的时候,也会有一些信息来表示任务完成的如何
一个最最直接的例子就是,C/C++中主函数的return0,在一开始学的时候很不理解为什么要return0,但其实0只是表示正常执行结束的信息,程序也可以返回1、2、3等内容来表示别的情况
当进程退出,但是还没有处理完后事的时候,就处于僵尸状态
变成僵尸状态的过程
我们在退出进程的时候,需要一些信息来表示任务完成的如何,那么这些信息要交给谁呢,也就是这个return给了谁
答案就是父进程,当一个进程在退出的时候,退出信息会由操作系统写入到当前退出进程的PCB中,可以允许进程的代码和数据空间被释放,但是不允许进程的PCB被立即释放
所以僵尸状态的定义就是,当一个进程退出,但退出信息没有被父进程读取,此时退出进程的PCB没有被释放,就处于僵尸状态
但是当一个进程长期处于僵尸状态时,如果不及时处理,就会有内存泄漏的风险
我们可以用下面的代码来观察和僵尸进程
#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("这是一个进程,%d\n",getpid());
}
}
return 0;
}
孤儿进程
孤儿进程就是我们知道的父进程挂了的进程
当一个进程的父进程挂了,就没有父进程给他回收了,就会一直占用资源,但是这时候操作系统没办法,只能领养他,来回收这个孤儿进程的资源
进程优先级
我们用进程优先级来表示CPU分配资源的先后顺序
优先级高的进程拥有先执行的权力,可以很好的改善系统的性能,还可以把进程运行到指定的CPU上
我们可以使用ps -l
或者ps -al
来查看优先级
现在我们只关心这两个信息
第一个是PRI,指的是进程优先级,值越小优先级越高
第二个是NI,指的是优先级修正数据,也成为nice值
在Linux中,优先级的取值范围是60到99,PRI就是默认优先级,真正的优先级则是默认优先级加上nice值
如何修改进程优先级
这里需要四步
- 输入top启动任务管理器
- 输入r来修改nice值
- 输入目标的进程pid
- 输入想要修改的值
系统允许优先级变低(nice值变大),如果想要将优先级变高(nice值减小)则需要sudo或root
修改优先级也有别的方法,这里不做赘述
为什么优先级有范围
主要是因为所有的进程都想要得到资源,当用户可以无限修改优先级时
优先级较低的进程就无法继续了,就会造成进程饥饿
当进程在一个CPU上被处理时,并不是一直放在CPU,过段时间可能会放其他的进程
这里普及一下并行和并发的概念
并行指的是多个CPU同时工作
并发指的是一个CPU在一段时间内进程切换,使得多个进程同时推进