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



相关文章
|
5月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
207 16
|
5月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
106 20
|
4月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
79 0
|
4月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
80 0
|
7月前
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
7月前
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
239 4
|
7月前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
340 5
|
7月前
|
存储 算法 数据处理
进程基础:概念、状态与生命周期
进程是操作系统进行资源分配和调度的基本单位,由程序段、数据段和进程控制块(PCB)组成。线程是进程中更小的执行单元,能独立运行且共享进程资源,具有轻量级和并发性特点。进程状态包括就绪、运行和阻塞,其生命周期分为创建、就绪、运行、阻塞和终止阶段。
360 2
|
存储 IDE Unix
用了这么久 Linux ,才知道这些概念。。。
我们大家应该知道,Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于 / 路径下,包括我们经常听到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系统中,各个厂家都定义了自己文件系统的命名构成,比较混乱,而且难以区分。
用了这么久 Linux ,才知道这些概念。。。
|
22天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
95 16