当前位置: 首页 > news >正文

【Linux】进程5——进程优先级

1.进程优先级

1.1.什么是进程优先级

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

1.2.为什么要进程优先级

  1. 资源是有限的,进程是多个的,注定了进程之间是竞争关系
  2. 操作系统必须保证大家是良心竞争,如果我们进程长时间得不到CPU资源,该进程的代码长时间无法得到推进——该进程的饥饿问题

如果长时间得不到CPU资源,那么这个在windows上表现为该程序长时间无响应 

2.查看系统进程

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

默认情况下,ps -l只会显示当前账号的进程,看不到别的终端的进程

我们ps -al就能看到别的终端的进程了

干扰信息太多了 ,我们筛选一下自己创建的myproc进程

此命令会显示当前用户下所有进程的内容。

我们很容易注意到其中的几个重要信息,有下:

  1. UID : 代表执行者的身份
  2. PID : 代表这个进程的代号
  3. PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  4. PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  5. NI :代表这个进程的nice值

2.1.UID

我们很明显的知道了,root的UID是0,zs_108的UID是1000

2.1.PRI和NI 

  • PRI也还是比较好理解的,不就是priority嘛,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。
  • Linux的默认优先级为80。Linux的优先级是可以被修改的,范围在[60,99]。
  • NI,就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  • 所以,调整进程优先级,在Linux下,就是调整进程nice值
  • nice其取值范围是-20至19,一共40个级别

        看完了上面的定义我们的问题就来了,在Linux中为什么调整优先级是受限制的呢?Linux为什么不能可以将[60,99]调整为[-∞,+∞]。

        那是因为如果不加限制,如果恶意将自己的优先级调整的非常高,而给其余人的优先级调整的非常低(优先级较高的进程先享受CPU的资源),那些系统开启自启动的进程也就是正常系统进程很难再享受到CPU的资源,会变得卡顿。这样的情况叫做进程饥饿。

        任何的分时操作系统在调度上都要保证较为公平的调度

 2.3.调整优先级

更改优先级的方法有挺多的,nice和renice指令是不错的选择,大家可以去百度一下

我们这里讲用top指令来更改优先级

 我们先开启两个账号

这个test的优先级是80

我们打开top

打开了之后,我们点击r——重新调整优先级

然后输入test的PID 

 按回车,接下来通过修改nice值来修改PRI

普通用户不能调优先级 

我们换root账号来重复上面的步骤,完成了

NICE值变成了-20,这个是因为他的范围限制!!!!

PRI的也是60,也是因为它的范围限制

我们此时再去调整PRI,我们把nice值设置为10,我们发现NI变成了10,但是PRI变成了90

注意:pri(old)的优先级再每一次设置时都是80,而不是前一次的优先级!!!

3.进程的调度与切换

  1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  3. 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

我们先来回答几个问题??

1.为什么函数返回值会被外界拿到??

        这是因为通过CPU寄存器保存了返回值

2.系统如何得治我们的进程运行到哪一行的代码了?
        通过寄存器pc,eip:记录当前进程正在执行指令的下一行指令的位置

3.寄存器的种类很多,那么这些寄存器起到什么作用?

        因为CPU里的寄存器保存的是进程相关的数据,有起到提高效率,进程高频数据被放入寄存器里 

  • 我们都知道在程序都被task_struct进行管理的,当进程需要运行时,就需要进行排队。
  • 我们也知道CPU中有个时间片的东西来控制各个进程一次在CPU中最长占用时间。
  • 当某些程序过大导致在规定的时间片内执行不完时,我们就需要切换到下一个队列中的程序。
  • 那之前的程序应该怎么办?

  CPU中存在大量的寄存器,我们在VS中调用堆栈可以看到,有一些:eds/ecs/fg/gs,eip,cr0-cr4,eax/ebx/ecx/edx,等待。这些寄存器可以帮助我们进行对这些代码数据进行记录保存,例如eip(也叫pc指针),这个寄存器可以记录我们的代码执行到了哪一部分。所以说进程在运行过程中要产生大量临时数据放在CPU的寄存器中!!!这些临时数据被我们保存在各个进程的PCB中。 后来恢复运行的时候我们寄存器只需从这里读取数据便可继续执行。

        CPU内部的所有临时数据我们叫做进程硬件的上下文。保存我们的进程上下文叫做保护上下文。在首次调度时,我们只需要将代码的起始地址放到eip中,然后逐步进行,进行时生成的临时数据被我们放到寄存器中。而二次调度时,我们只需要将上下文数据恢复到寄存器中即可!

 进程在被切换的时候的基本步骤如下:

  1. 保存上下文
  2. 恢复上下文

上图是早期进程切换源码 。

总结:所有的保存都是为了最终的恢复,所有的恢复都是为了在上一次保存的位置继续执行!!!

CPU内的寄存器只有一套,而寄存器内部保存的数据可以有多套。所以虽然寄存器数据放在了一个共享的CPU中,但是所有的数据其实都是被私有的!!

4.内核进程调度队列

上图是Linux2.6内核中进程队列的数据结构,之间关系也已经给大家画出来。在这里我们只看红框和蓝框对应的部分。

首先我们来看queue[140],真正的类型:task_struct* queue[40]。他其实是一个指针数组,里面存放的是task_struct指针,那为什么是140个呢?前0~99我们不用,因为0~99中我们存放的时实时操作,剩下的100~130一共40个刚好对应的是我们上文所提到的优先级的范围差值,正好在每一个数组中可以存放相同优先级的task_struct。这就好比一个C++中的哈希桶结构。

当我们执行进程时,我们就从优先级最高的开始依次往下执行。但是有些队列是为空的,我们需要依次进行扫描判断吗?这就要出现第二个数据int bitmap[5]。 一个int4个字节,32bit,那么这个数组就是32*5 = 160比特位。所以比特位的位置表示哪一个队列,比特位的内容表示这个队列是否为空!就是所谓的位图算法。

我们可以注意到蓝框与红框的内容是一样的,为了避免进程的饥饿问题,Linux操作系统就想出了以对策:

 我们可以看到上图中有一个array结构体数组,他里面存放了蓝框与红框的内容,蓝框中的queue被称为活跃队列,红框中被称为过期队列。当活跃队列中的进程开始被cpu进行调度时,后来的进程就不能在放入到活跃队列中去,而是放到过期队列中。直到活跃队列中的进程全部执行完毕后,再将活跃队列与过期队列进行交换,交换时只需要改变指针变量的内容即可。

相关文章:

【Linux】进程5——进程优先级

1.进程优先级 1.1.什么是进程优先级 cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上&#x…...

CNN简介与实现

CNN简介与实现 导语整体结构卷积层卷积填充步幅三维卷积立体化批处理 实现 池化层特点实现 CNN实现可视化总结参考文献 导语 CNN全称卷积神经网络,可谓声名远扬,被用于生活中的各个领域,也是最好理解的神经网络结构之一。 整体结构 相较于…...

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构

目录​​​​​​​ 一、引言 二、自动模型类(AutoModel) 2.1 概述 2.2 Model Head(模型头) 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预…...

Hadoop yixing(移行),新增表字段,删除表字段,修改存储格式

Hadoop yixing(移行),新增表字段,删除表字段,修改存储格式 一、hadoop中修改存储格式,比如从 textfile 转化为 orc 格式,表中的数据的组织形式要重新改变,就要将重新创建新格式的表将原来的数据按照新的格…...

使用汇编和proteus实现仿真数码管显示电路

proteus介绍: proteus是一个十分便捷的用于电路仿真的软件,可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域,使用代码实现电路功能的仿真。 汇编语言介绍: 百度百科介绍如下: 汇编语言是培养…...

【Unity】官方文档学习-光照系统

目录 1 前言 2 光照介绍 2.1 直接光与间接光 2.2 实时光照与烘焙光照 2.3 全局光照 3 光源 3.1 Directional Light 3.1.1 Color 3.1.2 Mode 3.1.3 Intensity 3.1.4 Indirect Multiplier 3.1.5 Shadow Type 3.1.6 Baked Shadow Angle 3.1.7 Realtime Shadows 3.1…...

1731. 每位经理的下属员工数量

1731. 每位经理的下属员工数量 题目链接:1731. 每位经理的下属员工数量 代码如下: # Write your MySQL query statement below select a.employee_id as employee_id,a.name as name,count(b.employee_id) as reports_count,round(avg(b.age),0) as av…...

特征筛选LASSO回归封装好的代码、数据集和结果

Gitee仓库地址:特征筛选LASSO回归封装好的代码、数据集和结果 README LassoFeatureSelector_main 这个是主函数文件,在实例化LassoFeatureSelector类时,需要传入下面这些参数: input_train_data_path:输入训练集的路…...

Autosar 通讯栈配置-手动配置PDU及Signal-基于ETAS软件

文章目录 前言System配置ISignalSystem SignalPduFrameISignal到System Signal的mapSystem Signal到Pdu的mapPdu到Frame的mapSignal配置Can配置CanHwFilterEcuC配置PduR配置CanIf配置CanIfInitCfgCanIfRxPduCfgCom配置ComIPduComISignalSWC配置Data mappingRTE接口Com配置补充总…...

Web前端工资调整:深入剖析与全面解读

Web前端工资调整:深入剖析与全面解读 在快速发展的互联网行业中,Web前端技术日新月异,而与之紧密相关的工资调整也成为了业内热议的话题。本文将从四个方面、五个方面、六个方面和七个方面,深入剖析Web前端工资调整的原因、趋势、…...

cesium已知两个点 写一个简单具有动画尾迹效果的抛物线

// 定义起点和终点的经纬度和高度 var start { longitude: 111.09683723811149, latitude: 38.92112250636146, elevation: 603.5831692856873 }; var end { longitude: 111.09769465526689, latitude: 38.92815375977821, elevation: 627.0132157062261 }; // 生成更多的中…...

C#中使用Mysql批量新增数据 MySqlBulkCopy

在C#中使用MySqlBulkCopy类来批量复制数据到MySQL数据库,首先需要确保你的项目中已经引用了MySQL Connector。以下是使用MySqlBulkCopy的基本步骤: 1.安装MySQL Connector。 可以通过NuGet安装MySQL Connector: 2.在代码中引用必要的命名空间…...

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的架构差异

安全之安全(security)博客目录导读 RME系统中的应用处理单元(PE)之间的架构差异可能会带来潜在的安全风险并增加管理软件的复杂性。例如,通过在ID_AA64MMFR0_EL1.PARange中为每个PE设置不同的值来支持不同的物理范围,可能会妨碍内…...

Ansible——stat模块

目录 参数总结 返回值 基础语法 常见的命令行示例 示例1:检查文件是否存在 示例2:获取文件详细信息 示例3:检查目录是否存在 示例4:获取文件的 MD5 校验和 示例5:获取文件的 MIME 类型 高级使用 示例6&…...

第二十节:带你梳理Vue2:Vue子组件向父组件传参(事件传参)

1. 自定义事件 除了可以处理原生的DOM事件, v-on指令也可以处理组件内部触发的自定义的事件,调用this.$emit()函数就可以触发一个自定义事件 $emit() 触发事件函数接受一个自定义事件的事件名以及其他任何给事件函数传递的参数. 然后就可以在组件上使用v-on来绑定这个自定义事…...

华为od-C卷100分题目 - 10寻找最富裕的小家庭

华为od-C卷100分题目 - 10寻找最富裕的小家庭 题目描述 在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。 现给你一棵树,请计算出最富裕的小家庭的财富和。…...

本地部署AI大模型 —— Ollama文档中文翻译

写在前面 来自Ollama GitHub项目的README.md 文档。文档中涉及的其它文档未翻译,但是对于本地部署大模型而言足够了。 Ollama 开始使用大模型。 macOS Download Windows 预览版 Download Linux curl -fsSL https://ollama.com/install.sh | sh手动安装说明 …...

【前端技术】 ES6 介绍及常用语法说明

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...

程序员具备的职业素养(个人见解)

程序员应该有什么职业素养? 1. 技术能力 毫无疑问,优秀的技术是程序员的必备。 -扎实的编程基础:熟练掌握至少一门编程语言,并理解基本的数据结构和算法,要做到精通!。 - 广泛的技术知识:了…...

Springboot 开发-- 集成 Activiti 7 流程引擎

引言 Activiti 7是一款遵循BPMN 2.0标准的开源工作流引擎,旨在为企业提供灵活、可扩展的流程管理功能。它支持图形化的流程设计、丰富的API接口、强大的执行引擎和完善的监控报表,帮助企业实现业务流程的自动化、规范化和智能化。本文将为您详细介绍 Ac…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

网络编程(UDP编程)

思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程

文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天,您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间?随着影像记录成为日常习惯&…...