Bootstrap

Linux进程——进程优先级与僵尸进程孤儿进程

僵尸进程

僵尸状态进程本质上就是死亡状态

在进程死亡之后,不会直接对进程进行释放,而是先会处理一些后事

进程在结束退出的时候,也会有一些信息来表示任务完成的如何

一个最最直接的例子就是,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;    
}   

QQ_1721043695612.png

孤儿进程

孤儿进程就是我们知道的父进程挂了的进程

当一个进程的父进程挂了,就没有父进程给他回收了,就会一直占用资源,但是这时候操作系统没办法,只能领养他,来回收这个孤儿进程的资源

进程优先级

我们用进程优先级来表示CPU分配资源的先后顺序

优先级高的进程拥有先执行的权力,可以很好的改善系统的性能,还可以把进程运行到指定的CPU上

我们可以使用ps -l或者ps -al来查看优先级

QQ_1721044073228.png

现在我们只关心这两个信息

第一个是PRI,指的是进程优先级,值越小优先级越高

第二个是NI,指的是优先级修正数据,也成为nice值

在Linux中,优先级的取值范围是60到99,PRI就是默认优先级,真正的优先级则是默认优先级加上nice值

如何修改进程优先级

这里需要四步

  1. 输入top启动任务管理器
  2. 输入r来修改nice值
  3. 输入目标的进程pid
  4. 输入想要修改的值

系统允许优先级变低(nice值变大),如果想要将优先级变高(nice值减小)则需要sudo或root

修改优先级也有别的方法,这里不做赘述

为什么优先级有范围

主要是因为所有的进程都想要得到资源,当用户可以无限修改优先级时

优先级较低的进程就无法继续了,就会造成进程饥饿

当进程在一个CPU上被处理时,并不是一直放在CPU,过段时间可能会放其他的进程

这里普及一下并行和并发的概念

并行指的是多个CPU同时工作

并发指的是一个CPU在一段时间内进程切换,使得多个进程同时推进

;