Linux进程——Linux进程与进程优先级

前言:在上一篇了解完一部分常见的进程状态后,我们先来把剩下的进程状态了解一下,再来进入进程优先级的学习!

如果对前面Linux进程不太熟悉可以先阅读:
Linux进程


在这里插入图片描述


本篇主要内容:
僵尸进程和孤儿进程
Linux进程优先级

在这里插入图片描述


目录

  • 1. 僵尸进程
    • 1.1 什么是僵尸状态
    • 1.2 为什么会存在僵尸状态
    • 1.3 观察僵尸状态
    • 1.4 僵尸进程的危害
  • 2. 孤儿进程
  • 3. 进程优先级
    • 3.1 基本概念
    • 3.2 查看进程优先级
    • 3.3 修改进程优先级
  • 4. 总结

1. 僵尸进程

僵尸进程就是处于僵尸状态下的进程!


1.1 什么是僵尸状态

僵尸状态:

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)
  • 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

僵尸状态就是Linux状态中的X死亡状态!


1.2 为什么会存在僵尸状态

Linux进程中,当一个进程死亡时不会立刻销毁,而是要等待我们读取死亡信息后才会死亡!

在这里插入图片描述
我们创建进程为的就是让他完成某种任务,但是我们该如何知道它是否成功完成,因此在进程退出时,需返回一些退出信息来表明任务得完成情况

比如:
我们之前所学习得main都要有return 0,这也是返回退出信息的一种!

因此我们可以知道:当进程退出但是还没被读取退出信息时处于僵尸状态


PCB释放:

  • 当一个进程在退出的时候,退出信息会由OS写入到当前退出进程的PCB中,可以允许进程的代码和数据空间被释放,但是不能允许进程的PCB被立即释放
  • 要让OS或者父进程读取到退出进程的PCB中的退出信息,得知子进程的退出原因,才能释放PCB!

综上所述:当一个进程退出了,但是退出信息还没被父进程读取,此时这个退出进程的PCB结构不被释放,此时这个退出进程就处于僵尸状态(Z)


1.3 观察僵尸状态

让我们来直观看了解一下僵尸状态

  1 #include<stdio.h>  
  2 #include<unistd.h>  
  3 #include<stdlib.h>  
  4   
  5 int main()  
  6 {  
  7     pid_t id = fork();  
  8     if(id < 0) return 1;  
  9     else if(id == 0)  
 10     {  
 11         // 子进程  
 12         int cnt = 5;  
 13         while(cnt)  
 14         {                                                                                                                                                                              
 15             printf("i am child, run times: %d\n",cnt--);  
 16             sleep(1);                  
 17         }                                         
 18         printf("i am child ,dead!: %d\n",cnt--);  
 19         exit(2);                       
 20     }                                  
 21     else                                                                                                                                     
 22     {                                                                                                                                        
 23         // 父进程                                                                                                                            
 24         while(1)                                                                                                                             
 25         {                                                                                                                                    
 26             printf("i am father, runing any times\n");                                                                                       
 27             sleep(1);                                                                                                                        
 28         }                                                                                                                                    
 29     }                                                                                                                                        
 30     return 0;                                                                                                                                
 31 }  

观察僵尸状态(Z)

我们可以直观的看到,当子进程退出,父进程没有回收退出信息时,子进程会进入僵尸状态


1.4 僵尸进程的危害

僵尸进程危害

  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态!
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护
  • 一个父进程创建了很多子进程,就是不回收,是会造成内存资源的浪费,因为数据结构对象本身就要占用内存,是要在内存的某个位置进行开辟空间
  • 内存泄漏

关于如何避免僵尸进程带来的危害我们后面细说

2. 孤儿进程

孤儿进程顾名思义就是处于孤儿状态下的进程。
开个玩笑,孤儿进程是父进程在子进程退出之前就先退出了,此时的子进程就称为“孤儿进程”


但是前面刚刚讲过一个进程在死亡时,PCB的死亡信息必须被读取后,才会释放PCB,但是如果父进程已经退出了,子进程的PCB该怎么释放呢?

  • 如果不回收,就会占用操作系统的资源
  • 因此操作系统会找一个“干爹”为其回收

我们先来写一段代码观察一下

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 
  5 int main()
  6 {
  7     pid_t id = fork();
  8     if(id < 0) return 1;
  9     else if(id == 0)
 10     {
 11         // 子进程
 12         while(1)
 13         {
 14             printf("i am child ......\n");
 15             sleep(1);
 16         }
 17     }
 18     else
 19     {
 20         // 父进程
 21         int cnt = 5;
 22         while(cnt)
 23         {
 24             printf("i am father, run times: %d\n",cnt--);
 25             sleep(1);
 26         }
 27         printf("i am father , dead: %d\n",cnt--);                    
 28         exit(2);
 29     }
 30     return 0;
 31 }

观察孤儿进程

子进程的父进程退出了,子进程要被领养,变成孤儿进程,而通过视频我们发现孤儿进程全部被1号进程统一领养了。

1号进程实际上就是操作系统


3. 进程优先级

3.1 基本概念

基本概念:

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

优先级的本质就是:得到某种资源的先后顺序

优先级和权限:

  • 优先级是能够得到申请的资源,但是需要等待一段时间
  • 权限是能不能得到某种资源的使用资格

3.2 查看进程优先级

我们可以用指令查看优先级:
指令:ps -al

在这里插入图片描述

这两个信息就是有关优先级的信息:

  • PRI :进程当前优先级,值越小表示优先级越高
  • NI :NICE值,表示优先级的修改数据

NICE其取值范围是-20至19,一共40个级别

Linux进程的优先级数值范围:60~99
Linux中默认进程的优先级都是:80
Linux是支持动态优先级调整的

为什么说这两个与优先级有关?
因为: PRI(新) = PRI(old) + NICE

注意:PRI(old)在修改时,同意按80处理!


3.3 修改进程优先级

当我们想要修改进程优先级时:

  • 输入top,启动任务管理器
  • 按r(renice)来修改NICE的值
  • 再输入目标进程的pid
  • 输入想要修改的NICE值

我们通过视频来直观了解一下:

修改进程优先级

我们发现系统进程的优先级只允许被修改高,而不能往低修改

注意:如果想往低修改需要进入root用户下或者sudo提权。

我们能不能将优先级改为60以下或者99以上呢?

NICE取值范围判断

我们通过视频可以看到Linux下的优先级取值范围是60 ~ 99,所以NI的取值范围是 -20 ~ 19,当输入的NI值小于-20时系统会自动将NI变成-20,当输入的NI值大于19时,系统会自动将NI变成19,并不会超出这个范围


那么为什么要设置出这个范围?

  • OS 调度的时候,较为均衡的让每一个进程都要得到调度!容易导致优先级较低的进程,长时间得不到CPU资源 --进程饥饿

因此:每一个进程不是占有CPU就一直运行,每隔一段时间,自动被从CPU上剥离下来

Linux 内核支持进程之间进行cpu资源抢占的,基于时间片的轮转式抢占式内核

在这里插入图片描述

  • 多个进程高频来回的进行切换,逻辑上就是一个CPU划分成了多个CPU只不过性能也会被“分走”,这就是并发
  • 并发要研究的是进程间切换,我们下一节再来详谈

4. 总结

本篇文章前部分紧贴上篇Linux进程,分析完了Linux下常见的进程状态,然后初步了解了Linux进程优先级,而进程优先级与前面内容相差较大,希望大家能够多花点时间理解!

谢谢大家支持本篇到这里就结束了
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绘画作品3d数字云展厅提升大众的艺术鉴赏和欣赏能力

3D虚拟展厅作为未来艺术的展示途径&#xff0c;正逐渐成为文化创意产业蓬勃发展的重要引擎。这一创新形式不仅打破了传统艺术展览的局限性&#xff0c;更以其独特的魅力吸引着全球观众的目光。 3D虚拟艺术品展厅以其独特的魅力&#xff0c;助力提升大众的艺术鉴赏和欣赏能力。观…

python - rst file to html

文章目录 python - rst file to html概述笔记下载安装PyCharm最新的学习版新建虚拟环境为Conda的工程添加docutils库新建python文件&#xff0c;添加转换代码运行自己写的python文件&#xff0c;执行转换转换结果END python - rst file to html 概述 开源工程中有一个.rst文件…

自动驾驶主流芯片及平台架构(一)

零部件成本下降、中低端车竞争加剧&#xff0c;推动ADAS渗透率在中国市场快速提升&#xff0c;自主品牌ADAS装配量大幅提升 零部件成本下降、中低端车竞争加剧&#xff0c;推动ADAS渗透率在中国市场快速提升&#xff0c;自主品牌ADAS装配量大幅提升。5年前在一些高端车型上才有…

(持续更新升级)火爆的ChatGPT源码+高质量AI绘画系统+分销功能+详细图文搭建部署教程

随着人工智能技术的迅猛发展&#xff0c;智能对话和创意艺术不再是遥不可及&#xff0c;而是可以触手可及的现实。 分享一款集ChatGPT源码、高质量AI绘画系统以及强大分销功能于一体的系统源码&#xff0c;对接了大名鼎鼎的ChatGPT接口及Midjourney两个王牌接口&#xff0c;另…

C++ 函数与指针

函数内部数据是地址需要传递给调用函数&#xff0c;返回的当然是指针了&#xff01;当然&#xff0c;这个返回地址也可以通过函数参数返回&#xff01; 函数的参数是指针可以输出函数多个结果&#xff0c;返回值本身就是返回数据&#xff0c;什么时候需要返回指针呢&#xff1f…

【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

迅为RK3568开发板资料说明4750+页专属文档专为3568编写

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求 子组件 <div><a-modaltitle"列配置" :visible"visible" :closable"false" :footer"null"width"800px" height"448px"><div><a-row>…

Netty一文搞懂入门篇<随手笔记>

1.Java IO的读写原理 IO是Input和Output的缩写&#xff0c;即输入和输出。用户程序进行IO的读写基本上会用到read和write两大系统调用。 read把数据从内核缓冲区复制到进程缓冲区&#xff0c;write是把数据从进程缓冲区复制到内核缓冲区。 这两大系统的调用都不负责数据在内核…

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

作者&#xff1a;天彤 Atlassian 在 2020 年官方发布公告&#xff0c;从 2021 年起停止 Jira Server 产品的销售&#xff0c;并且在 2024 年彻底停止 Server 端产品的服务支持&#xff0c;这对于国内使用 Jira 产品的企业和研发团队造成了不小的影响。而此时国内很多 DevOps 产…

LeetCode面试298,二叉树最长连续序列(Python)

开始想着dfs&#xff0c;两种情况 1.以root为根 2.不以root为根 但是这样需要两个dfs分别进行&#xff0c;那么时间复杂度就上去了。 class Solution:def longestConsecutive(self, root: Optional[TreeNode]) -> int:def dfs(root):# 以root为根节点&#xff0c;可以延…

【系统分析师】系统分析部分

文章目录 1、系统分析概述2、详细调查2.1 为什么要做详细调查&#xff1f;2.2 详细调查的原则2.3 详细调查的内容2.4 详细调查的方法 3、现有系统分析3.1 获得系统的物理模型3.2 抽象出现有系统的逻辑模型3.3 建立新系统的逻辑模型3.4 建立新系统的物理模型 4、组织结构分析4.1…

文件夹批量重命名,轻松实现简体中文翻译成繁体中文,文件夹批量改名新体验

文件夹的管理和命名显得尤为重要。你是否曾为了给文件夹取一个合适的名字而 绞尽脑汁&#xff1f;是否因为需要批量修改文件夹名而苦恼不已&#xff1f;现在&#xff0c;我们为你带来一款强大的文件夹批量改名工具&#xff0c;不仅能轻松实现简体中文到繁体中文的转换&#xf…

5月7日监控二叉树+斐波那契数

968.监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&#xff…

LeCun转发,AI让失语者重新说话!纽约大学发布全新「神经-语音」解码器 | 最新快讯

新智元报道 编辑&#xff1a;LRT 通过采集皮层电图&#xff08;ECoG&#xff09;的数据信号&#xff0c;模型可以将其转换为可解释的语音参数&#xff08;如音高&#xff0c;响度&#xff0c;共振峰频率等&#xff09;&#xff0c;并合成出既准确又自然的语音波形。 脑机接口&a…

【C++ | 函数】默认参数、哑元参数、函数重载、内联函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-04 1…

【Flutter】App内购支付集成 Google和Apple支付和服务器验证全流程

Flutter支付集成 前言&#xff1a; 以谷歌内购为例&#xff0c;我们需要做的总共为三步 需要在谷歌市场配置商品&#xff0c;设置测试渠道&#xff0c;配置开发者账号&#xff0c;设置对应权限。配置完商品之后&#xff0c;如何在 Flutter 中获取到商品&#xff0c;购买指定…

如何为数据库中新建用户B复制用户A的表和视图权限?

故事背景&#xff1a; 公司使用的是SQL Server数据库&#xff0c;经常会碰到一种情况&#xff0c;需要为新入职的员工赋予同组内其他同事的权限。 常用方法: 1) 为同一组申请创建统一的Security Group(安全组)&#xff0c;为创建的组分配相关表和视图的访问权限。不管员工入职…

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作 读者优先实例代码分析 写者优先示例代码分析 实验要求 创建一个控制台进程&#xff0c;此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展&#xff0c;全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中&#xff0c;半导体作为信息产业的基础与核心&#xff0c;其重要性日益凸显&#xff0c;半导体的应用场景和市场需求将进一步扩大。 然而&#xff0c;在这一繁荣的背后&#x…