• 【linux进程(四)】僵尸进程和孤儿进程概念&进程优先级讲解


    💓博主CSDN主页:杭电码农-NEO💓

    ⏩专栏分类:Linux从入门到精通

    🚚代码仓库:NEO的学习日记🚚

    🌹关注我🫵带你学更多操作系统知识
      🔝🔝


    在这里插入图片描述

    1. 前言

    本篇文章的两种进程状态:
    僵尸进程和孤儿进程是对上篇文章的补充
    进程优先级在整个进程的学习中并不是
    很重要,但是需要它为后面的知识做铺垫

    本章重点:

    本篇文章着重讲解什么是僵尸进程?
    僵尸进程是怎样形成的?僵尸进程的危害
    以及孤儿进程的形成原因和OS的解决方法
    最后讲解进程优先级相关内容,包括PRI
    NI值得含义,Linux下得优先级范围


    2. 什么是僵尸进程?

    在上一篇文章我们知道Linux中
    具体有以下几种进程状态:

    在这里插入图片描述在这里插入图片描述
    僵尸状态本质是就是死亡状态

    当一个正常人死亡时,警察不可能直接
    将人拖到火葬场火化,而是要确认此人
    是自杀还是它杀还是自然死亡,还需要
    给整个社会一个交代!Linux中得进程也是
    如此,当一个进程死亡时不会立刻销毁
    而是会处理一些后事!

    我们创建一个进程得目的是为了完成
    某种任务,但是你怎么知道我把任务
    完成得怎么样了?所以进程在退出时需
    返回一些退出信息来表示任务完成得如何!

    比如写C/C++代码时的return0:

    int main()
    {
    	return 0;
    	//return 1;
    	//return 2;
    	//return 3;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    返回0表示程序正常执行,程序也可以返回1.2.3

    现在可以初步得出结论:

    当进程退出但是还没处理完后事时
    此时处于僵尸状态

    在这里插入图片描述


    3. 变成僵尸状态的具体过程

    由上所述你怎么知道我把任务完成得怎么样?
    的我当然是退出进程,那么你指的是什么?
    答案是退出进程的父进程

    在这里插入图片描述

    事实上,要让父进程读取到退出PCB
    中的退出信息,得知子进程退出的原因
    此时才能释放退出进程的PCB!

    此时我们就得到了僵尸状态的确定定义:

    当一个进程退出了,但是退出信息还没
    被父进程读取,此时操作系统必然会维护
    这个退出进程的PCB结构不被释放,此时
    这个退出进程就处于僵尸状态(Z)

    若一个进程长期处于Z状态,不及时
    回收,此时会有内存泄漏的风险!
    
    • 1
    • 2

    我们可以通过下面的代码来观察僵尸状态:

    #include     
    #include     
    #include     
    #include                                                                
    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;    
    }   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    查看进程的Z状态


    4. 什么是孤儿进程?

    其实听这个名字就知道,孤儿进程
    大概率就是父进程挂掉了的进程

    孤儿进程定义:

    当一个子进程还没有退出,而父进程
    先退出了,这个子进程被称为孤儿进程

    当一个进程称为孤儿进程了,意味着
    没有父进程为他:“收尸"了,不回收就会
    占用操作系统的资源,最终使得操作系统
    崩溃!所以操作系统会让孤儿进程找
    一个"干爹"充当父进程为它"收尸”

    在这里插入图片描述

    细心的同学可能会在实践中发现
    孤儿进程全部被1号进程统一领养了
    然而这个1号进程实际上就是操作系统本身!


    5. 什么是进程优先级?

    cpu资源分配的先后顺序
    就是指进程的优先级(priority)

    先区分优先级和权限的区别:

    • 优先级代表一定能得到申请的资源
      只是现在要考虑得到资源的时间问题

    • 权限代表有没有资格得到申请的资源
      是要考虑能否的问题

    在这里插入图片描述

    查看进程的优先级:

    使用指令: ps -lps -al

    在这里插入图片描述
    在这个图中我们只需要关心两个信息:

    1. PRI:进程优先级,值越小,优先级越高
    2. NI:优先级的修正数据(nice值)

    干货直诉:

    在Linux操作系统中,进程的默认优先级
    都是80,并且Linux中进程的优先级取值
    范围是:60~99,进程真正的优先级和上面
    对应的PRI与NI的关系可以总结如下:

    在这里插入图片描述


    6. 怎么修改进程优先级?

    使用一连串指令修改指定进程的优先级:

    1. 输入top启动任务管理器
    2. 输入r(renice)来修改NI的值
    3. 再输入目标进程的pid来定位
    4. 输入想要修改的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进程学习打上基础!
    希望我的文章对你有帮助,谢谢你的阅读!

    拓展阅读:修改优先级的其他方法:

    修改优先级的shell命令


  • 相关阅读:
    开源Linux社区Armbian开发指南
    Elasticsearch报错ValueError: Either ‘hosts‘ or ‘cloud_id‘ must be specified
    Redis入门完整教程:Bitmaps
    案例分析:大疆的电子产品说明书在组织分类结构方面值得借鉴的地方
    Ubuuntu22.04 LTS 用户管理,新建用户 adduser,sudo,管理员用户
    java关于wait()和notify()方法
    基于计算机技术的媒体分析
    线程安全问题的产生条件、解决方式
    C# 匿名方法、Lambda、Linq概念及联系
    华测RTK采集的GPX数据如何带属性转出kml、shp进行后续的管理和分析
  • 原文地址:https://blog.csdn.net/m0_61982936/article/details/133797561