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

news2024/11/25 22:24:55

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

如果对前面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.coloradmin.cn/o/1648839.html

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

相关文章

63-HDMI转VGA电路设计

视频链接 HDMI转VGA电路设计01_哔哩哔哩_bilibili HDMI转VGA电路设计 HDMI电路设计&#xff08;参考第13课&#xff09; VGA电路设计&#xff08;参考第15课&#xff09; DP转VGA电路设计&#xff08;参考第75课&#xff09; 1、HDMI转VGA转换器 2、HDMI转VGA简介 1、解…

融知财经:期货风险有多大,期货风险进行控制的方法

期货价格变化远大于股票市场&#xff0c;其风险也大于股票市场&#xff0c;当然其预期收益机会相对较高&#xff0c;因此期货更适合激进型投资者。在期货投资市场中&#xff0c;除了市场外的常见风险外&#xff0c;转型期投资者的投机心理和杠杆效应会增加期货的交易风险&#…

获取波形极值与间距并显示

获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…

铜价飙升,慧能泰HUSB332F带你狂飙

铜价&#xff0c;近期涨的很飘&#xff0c;涨到怀疑人生。继黄金后&#xff0c;铜成了另一个疯涨的明星&#xff01;作为电线电缆生产不可或缺的原材料&#xff0c;铜的身价暴涨直接拉响了成本警报&#xff0c;压缩了企业的利润空间。众多电线电缆制造商面临着严峻的挑战与考验…

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

【Python】字典题

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) for key,value in dic.i…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者&#xff1a;Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能&#xff0c;优先考虑攻击&#xff0c;而不是警报。 传统的安全信息与事件管理系统&#xff08;SIEM&#xff09;在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

DCEP数字人民币:中国法定区块链中数字货币

一、背景 作为全球第二大经济体&#xff0c;中国在数字货币领域的发展一直备受关注。近年来&#xff0c;中国政府积极推动数字货币的研究和试点工作&#xff0c;逐步开放数字货币交易试点&#xff0c;并计划推出中国唯一合法数字货币——数字人民币&#xff08;RMB Coin&#…

tcping的安装,ping和tcping的区别

ping和tcping的区别 功能不同&#xff1a; Ping&#xff1a;Ping是一种基于ICMP协议的网络工具&#xff0c;用于测试主机之间的连通性。它发送ICMP回显请求&#xff08;Echo Request&#xff09;到目标主机&#xff0c;并等待目标主机返回ICMP回显应答&#xff08;Echo Reply…

【Unity】使用Resources.LoadAll读取文件的顺序问题

最近在做客户的一个项目&#xff0c;其中的一个模块使用到了照片&#xff0c;但是发现了一个很严重的问题。当你在使用Unity的时候&#xff0c;它竟然不按照顺序读取&#xff1f;这个机器人是不是逻辑有问题&#xff1f;如下图&#xff1a; 名字脱敏了哈。。。 照片比较多&…

订单超时自动取消的实践方案

1、定时任务方案 方案流程&#xff1a; 每隔 30 秒查询数据库&#xff0c;取出最近的 N 条未支付的订单。 遍历查询出来的订单列表&#xff0c;判断当前时间减去订单的创建时间是否超过了支付超时时间&#xff0c;如果超时则对该订单执行取消操作。 定时任务方案工程实现相…

DAPP开发:揭秘DAPP软件开发的秘密

随着区块链技术的飞速发展&#xff0c;DAPP&#xff08;去中心化应用&#xff09;的开发逐渐成为了一个热门话题。在本文中&#xff0c;我们将探讨如何从零开始开发DAPP软件&#xff0c;并深入思考DAPP开发中的关键问题。 一、了解DAPP开发的基础知识 在开始开发DAPP之前&…

Web3:下一代互联网的科技进化

随着科技的不断演进&#xff0c;互联网已经成为了我们生活中不可或缺的一部分。而在Web3时代&#xff0c;我们将会见证互联网进化的下一个阶段。本文将探讨Web3作为下一代互联网的科技进化&#xff0c;以及它所带来的重要变革和影响。 传统互联网的局限性 传统互联网存在诸多…

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

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

开发组合php+mysql 人才招聘小程序源码搭建 招聘平台系统源码+详细图文搭建部署教程

随着互联网的快速发展&#xff0c;传统的招聘方式已经不能满足企业和求职者的需求。为了提高招聘效率&#xff0c;降低招聘成本&#xff0c;越来越多的人开始关注人才招聘小程序、在线招聘平台。分享一个人才招聘小程序源码及搭建&#xff0c;让招聘更加高效便捷。系统是运营级…

Android getevent命令详细分析

在调试Android 的输入事件时&#xff0c;经常使用 “getevent -lrt” 命令&#xff0c;来确认驱动上报数据是否正常。从源码的角度来详细的分析一下getevent 这个程序。 首先用ls命令来看一下getevent lrwxr-xr-x 1 root shell 7 2023-11-20 10:08 system/bin/getevent -> …

视频号小店是普通人的机会吗?看完你就明白了!

大家好&#xff0c;我是电商小V 视频号小店是普通人的机会吗&#xff1f;我可以很确定的说&#xff1a;视频号小店就是普通人的机会&#xff0c;并且是很大的机会&#xff0c; 首先就是视频号小店这个项目还没有自然流量的入口&#xff0c;是一个还没有完全开放私域电商的平台&…

python+flask+ldap3搭建简易版IDaaS系统(前端站点)

Python工具开源专栏 Py0006 pythonflaskldap3搭建简易版IDaaS系统&#xff08;前端站点&#xff09; Python工具开源专栏前言目录结构前端网站的部分演示首页查询数据数据同步数据关联查询系统日志 完整代码已在GitHub上开源 前言 pythonflaskldap3搭建简易版IDaaS系统的前端站…

XSS漏洞---XSS-labs通关教程

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 Level-1 过滤源码&#xff1a;无 pyload&#xff1a; name<script>alert(1)</script> Level-2 过滤源码&#xff1a;利用转译函数将特殊字符转译为实体字符 $str $_GET["…

RNN 及其变体的数学理解

目录 一、介绍&#xff1a; 二、什么是 RNN 以及它与前馈神经网络有何不同&#xff1a; 三、RNN 背后的数学 3.1 RNN的数学方程 3.2 参数和梯度 3.2.1 损耗相对于V的梯度 3.2.2 损失相对于W的梯度 四、RNN 变体&#xff08;LSTM 和 GRU&#xff09; 4.1 LSTM&#xff08;长短期…