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

news2025/2/28 12:07:59

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

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

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

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


在这里插入图片描述

进程优先级

  • 1. 前言
  • 2. 什么是僵尸进程?
  • 3. 变成僵尸状态的具体过程
  • 4. 什么是孤儿进程?
  • 5. 什么是进程优先级?
  • 6. 怎么修改进程优先级?
  • 7. 为什么优先级不能随意修改?
  • 8. 总结以及拓展

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快递查询神器:一键筛选超时快递的方法揭秘

快递服务的快速发展&#xff0c;为我们的生活带来了极大的方便。然而&#xff0c;由于各种原因&#xff0c;有时候我们会遇到快递超时的情况&#xff0c;这给我们的生活带来了一些困扰。但是&#xff0c;现在有了一款神奇的快递查询助手软件&#xff0c;能够一键筛选超时快递&a…

上传文件夹里面的文件后,按树结构的table表格展示

1. 先处理最简单的 原始数据大概是这样: let fileArr [{progress: 100,status: 成功,type: 通号,webkitRelativePath: "六捷数据2023-05-04 163909/G163/Abis口详细信息_(G163)(380BL3544-0)(14984173988)(2018-01-24 174431.0740—2018-01-24 180347.9070).xls"…

Node.js 正在逐渐被淘汰!Bun 1.0 正在改变 JavaScript 的游戏规则

在深入讨论之前&#xff0c;我们需要解释什么是 JavaScript 运行时以及为什么我们应该关心其速度。 想象一下&#xff0c;你用 JavaScript 写了一个故事&#xff0c;需要有人大声读出来。JavaScript 运行时就像是那个友好的叙述者&#xff0c;为你的故事赋予生命&#xff01;它…

vue实时显示当前年月日时分秒有时间单位的<script setup>写法

在Vue 3中&#xff0c;您可以使用<script setup>语法来编写实时显示当前年月日时分秒并显示时间单位的代码。以下是一个示例&#xff1a; <template> <div> 当前时间&#xff1a;{{ currentDateTime }} </div> </template><script setup>…

el-table 表格里面有tree 层级 进行勾选和反勾选

// 勾选全选反勾选等实现setChecked(data) {for (let i 0; i < data.length; i) {const node data[i];if (node.isCheck) {// 如果当前节点被勾选&#xff0c;将其子节点全部设置为选中状态if(node.children) {for (let j 0; j < node.children.length; j) {const chi…

十三、前端开发知识快速入门

目录 一、HTML概述和基本结构1.1 概述1.2 基本结构1.3 html文档类型1.4 html注释 二、HTML常用标签2.1 块标签2.2 行内标签2.3 字符实体2.4 图片标签2.5 链接标签2.6 列表标签2.7 表单2.8 表格 三、页面布局四、CSS样式4.1 基本语法和页面引用4.2 文本样式设置4.3 颜色表示法4.…

asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 会议预约管理系统 二、…

ES _bulk 批量操作用法

es 的 bulk 操作&#xff0c;是用来批量发送请求&#xff0c;或者理解为批量操作的。 支持4种操作 bulk 支持多种操作&#xff0c;如下create、index、update、delete。 create 如果文档不存在就创建&#xff0c;但如果文档存在就返回错误index 如果文档不存在就创建&#x…

敏捷开发流程图Scrum

敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示&#xff0c;以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例&#xff1a; 转自&#xff1a;Leangoo.com 免费敏捷工具 这个流程图涵盖了Scrum框架的主要阶段和活动&#xff0c;其中包括&…

ABAP 采购组 条目 Z001 不存在T161内-请检查输入

背景&#xff1a;在ALV报表更改PR采购组 做法&#xff1a;ALV报表取出PR相关数据&#xff0c;直接将采购组列设置为可编辑&#xff0c;然后设置按钮更改逻辑。 操作&#xff1a;将采购组值更新&#xff08;从原来500改为600&#xff09;&#xff0c;然后点更改功能按钮&#xf…

VMware Horizon 8 运维系列(四)云桌面虚拟机被移除网卡

前言 最近发现有一台云桌面虚拟机经常网卡莫名其妙就被删除了,从而造成网络中断,客户端无法连接到该虚拟机桌面,经过分析判断可能是由于用户在使用u盘的时候,误删了虚拟网卡设备造成的。 问题描述: 故障现象:客户机无法访问云桌面虚拟机: 查看桌面池列表,发现该虚拟机…

C++指针解读(1)-- 什么是指针

变量的内存地址叫指针&#xff0c;存放指针的变量叫指针变量。估计不少人会混淆这2个概念&#xff0c;而且有的书籍资料把“指针变量”称为“指针”。 1、数据的存储方式 程序中的数据都会占用一块内存空间&#xff0c;不同数据类型占用的内存大小不同。比如char、bool是1个字…

树上启发式合并:xor1

https://vjudge.net/contest/587311#problem/C 最近没打这个套路&#xff0c;场上忘了 发现和一堆lca什么的有关&#xff0c;然后又是lca下不同的儿子&#xff0c;考虑树上启发式合并。 对于 i ⊕ j i\oplus j i⊕j&#xff0c;我们可以拆位枚举 然后常数大会被卡常。但树上…

AndroidStudio模拟器使用rootAVD ROOT(失败)

下载rootAVD $ git clone https://github.com/newbit1/rootAVD.git 下载Magist Releases topjohnwu/Magisk GitHub 改名为Magist.zip&#xff0c;然后替换 察看设备 > .\rootAVD.bat ListAllAVDsrootAVD.bat system-images\android-31\google_apis_playstore\x86_64…

数据库系统概念学习2

对空值和布尔值的聚集 嵌套子查询 子查询是嵌套在另一个查询中的 select-from-where 表达式 集合成员资格 连接词 in 测试元组是否是集合中的成员&#xff0c;连接词 not in 测试元组是否不是集合中的成员 ↑ 找出在 2009 年球季和 2010 年春季学期同时开课的所有课程 ↓ 找…

docker安装sql-server数据库,使用navicat实现备份数据库导入

docker安装sql-server&#xff0c;使用navicat实现备份数据库导入 1、docker安装sql-server数据库2、使用navicat连接sql-server3、使用navicat导入备份数据库1、第一步&#xff1a;选择需要备份的数据源2、第二步 &#xff08;选择备份计划&#xff0c;设置还原文件位置信息&a…

云计算到底牛x在哪里?

你们好&#xff0c;我的网工朋友。 云计算已经霸屏行业有段时间了&#xff0c;但很多粉丝朋友还是不太明白什么是云计算&#xff0c;为什么要学云计算。 从宏观来说&#xff0c;其实云计算的优点很多。 就和传统模式相比&#xff0c;云计算在六个维度都有显著的提升点。 比…

git主干master分支回滚到历史版本(不会有错误的提交记录)

master版本,“合并错了”的回滚步骤: (这样做不会有“合并错了”的提交记录) 注意&#xff1a;操作前先对master拉一个分支出来&#xff0c;做备份&#xff1b; 1. 在gitLab的上一次合并记录&#xff0c;复制commit-id ​ 2. 在本地执行检出master版本&#xff0c;执行 git re…

阿里云价格计算器入口(一键计算精准报价)

阿里云服务器价格计算器&#xff0c;鼠标选择云服务器ECS实例规格、地域、系统盘、带宽及购买时长即可一键计算出精准报价&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器价格计算器链接地址&#xff1a; 阿里云服务器价格计算器 先打开阿里云服务器ECS页面 aliyunba…

浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素

浅析倾斜摄影三维模型&#xff08;3D&#xff09;几何坐标精度偏差的几个因素 倾斜摄影是一种通过倾斜角度较大的相机拍摄建筑物、地形等场景&#xff0c;从而生成高精度的三维模型的技术。然而&#xff0c;在进行倾斜摄影操作时&#xff0c;由于多种因素的影响&#xff0c;导致…