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



相关文章
|
2天前
|
存储 安全 Linux
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
|
2天前
|
API 开发工具 Windows
LabVIEW中编程更改进程的优先级
LabVIEW中编程更改进程的优先级
10 0
|
2天前
|
存储 Linux Shell
Linux:进程概念
Linux:进程概念
20 8
|
2天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
13 0
|
2天前
|
存储 网络协议 Unix
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
8 0
|
2天前
|
存储 安全 Linux
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
8 0
|
2天前
|
存储 安全 Linux
深入理解 Linux 用户和用户组的基本概念 + 相关命令 (一篇就够)
深入理解 Linux 用户和用户组的基本概念 + 相关命令 (一篇就够)
|
2天前
|
Linux Shell 程序员
【Linux】权限(shell运行原理、概念,Linux权限)
【Linux】权限(shell运行原理、概念,Linux权限)
15 2
|
2天前
|
安全 Unix Linux
【一文速通Linux基础概念,小白可入】
【一文速通Linux基础概念,小白可入】
14 0
|
2天前
|
Unix Linux
【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)
【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)