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

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

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 -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命令



相关文章
|
20天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
45 1
|
8天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
61 13
|
15天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
23天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
144 4
linux进程管理万字详解!!!
|
28天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
85 8
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
91 1
|
1月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
1月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
71 4