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



相关文章
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
513 67
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
629 16
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
477 16
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
307 20
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
360 0
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
404 0
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
285 0
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
367 0
|
存储 IDE Unix
用了这么久 Linux ,才知道这些概念。。。
我们大家应该知道,Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于 / 路径下,包括我们经常听到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系统中,各个厂家都定义了自己文件系统的命名构成,比较混乱,而且难以区分。
用了这么久 Linux ,才知道这些概念。。。
|
11月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
1066 1
二、Linux文本处理与文件操作核心命令