Linux相关概念和重要知识点(10)(进程优先级、进程切换)

news2024/10/1 9:41:39

1.进程优先级

(1)为什么要有进程优先级

优先级的本质是获得某种资源的先后顺序,如排队买票这件事上排队的本质是在确认优先级,售票窗口就是要竞争的资源。为什么要有优先级?本质就是目标资源比较少,如果每个人都有一个售票窗口,那就不需要排队了,当然这是不可能的。

在计算机中CPU、设备的数量和进程的数量比起来都叫做少量,这也反映了CPU、设备资源是有价值的,毕竟物以稀为贵。进程的优先级竞争的是CPU资源。

注意优先级和权限的区别:优先级(建立在已经有权限的基础之上,就是谁先谁后的问题),权限(能还是不能的问题),没权限一定没有优先级的概念

(2)优先级的查看

每个进程的PCB里面就有优先级属性,优先级属性是由int表示的。Linux中优先级数字越小,优先级越高,类似于排名。

ps -al可以查看进程优先级属性

PRI(priority)代表当前进程的总优先级对应数字;NI(nice,细微的)代表优先级的微调数据PRI(最终优先级)= 默认优先级 + NI(优先级的修正数据)

在Linux中,我们每次创建的进程的默认优先级都是80(就算上次调度该进程PRI不是80,这次也依然默认是80),如果我们不显式NI修改,那么进程最终的PRI就是80。如果修改,那么PRI就会发生变化,就像上图的其中一个进程,NI == 19,那么它的PRI就是80 + 19 == 99。事实上NI的取值范围是-20 ~ 19,对应PRI为60 ~ 99共40种PRI取值。之所以规定优先级的微调最多浮动40,一方面是有相关统计和计算得出,一方面是防止进程优先级过高导致进程调度过于不公平,因为Linux终归到底是分时操作系统而不是实时操作系统,多个进程要有竞争性,保证在一个时间段里有多个进程同时推进而不是只处理一个进程。

在上面的图中,我们还可以关注UID,这是标志这当前用户的数字,因为用户名千奇百怪,作为属性性能开销过大,所以每个用户都会分配一个UID,ls -n就能以用户的UID形式显示了

每个用户在创建进程时PCB里面就含有用户的UID信息了,而每次的指令也是一个进程,所以当我们cd访问文件目录时就会尝试创建进程,PCB里面的UID就会和权限里的信息进行比对,从而实现根据不同身份进行拦截,这也是实现权限管理的关键。

(3)修改优先级

修改调整优先级本质是调整NI值

top可以查看当前系统的所有优先级信息

之后,使用r (pid) (回车) (微调值:-20 ~ 19)就可以实现NI值的修改,进而修改PRI

注意有的优先级修改需要root权限(特别是提高优先级),我们sudo即可

(4)优先级在runqueue中的体现

上面已经讲清楚PRI和NI组成优先级以及修改的方法。但问题是,优先级如何体现在runqueue中呢?

CPU每个核心都有一个调度器,分别管理着内存中的运行队列runqueue。为了体现优先级,runqueue采用多种数据结构来管理。以hash表为例,对于struct task_struct* queue[140],每个元素都是指针。假设前100个下标是给实时进程用的(实时进程不会被切换),还剩40个刚好分配给40种优先级状态。进程优先级是60-99,按照hash映射的规则存到对应位置种,其中为减少哈希冲突,采用哈希桶,即每个桶下面很多同优先级的进程。最后OS调度时根据数组相对位置调度进程。

2.进程切换

(1)时间片

Linux是一个分时操作系统,调度的公平性是这个系统的一个重要原则,包括NI的修改是有限的,也是基于这个原则来限制的。

进程是基于时间片来进行调度轮转的,当一个进程在时间片到的时候,不一定执行完了,但此时为了公平性它不能再执行了,CPU必须切换开始执行下一个进程的任务。对于这个没执行完的进程,OS需要保存它当前执行的位置,等到下一次重新调度时,再接着继续执行。但问题是:进程如何切换?当前执行的位置如何保存?

(2)寄存器

CPU内部存储数据的是寄存器(高速缓存L1、L2、L3也集成在CPU中,只不过速度慢一些,当然比DRAM还是快很多),常见的寄存器有eax、ebx、ecx、eflag、eds、efs、egs、cr0、cr1、cr2、ebp、esp、eip(pc)、ir...在上下文中,我们重点关心 eip(pc)、ir,它们在进程保存上下文数据中有重要作用。

(3)保存上下文数据是什么

对于时间片到了但还没有执行完的进程,OS要想办法将它当前执行的位置保存起来,方便下次继续执行,这个过程就是保存上下文数据以及恢复上下文数据。上下文数据就是代码和数据的相关执行情况。这类似于给学校请假时记录和回学校销假。

(4)eip(pc)、ir在保存上下文数据中的作用以及流程

当调度器调度到该进程时,内存中进程相关的代码和数据会被调用。CPU处理进程时,要存储执行指令相关的信息(当前执行指令、下一句指令的地址),这会产生临时数据,这是在CPU的寄存器中保存的。

eip存的是当前正在执行指令的下一条指令的地址。我们的代码(都被转为指令)执行的下一个位置是由eip(Extended Instruction Pointer,扩展指令指针)决定的。

ir是指令寄存器,保存就是CPU正在执行的指令eip告诉CPU控制器该读哪条指令,控制器就会根据地址去读,存到ir里。读有可能是到高速缓存中读(缓存中有该指令,称为缓存命中),否则只能到DRAM中读了(速度会慢一些)。每一次读取指令并保存到ir后,eip就会马上更新下一条指令的地址。

在ir保存指令且eip更新完成之后,CPU就会执行ir里面的指令,之后ir再次导入eip指定位置的指令,eip更新,CPU处理,以此类推......此外,还有eflag记录是否溢出,eax、ebx等用于保存变量。整个流程都是在CPU的控制器的管理下进行的。

当进程时间片到了之后,在进程被切换之前,OS会将eax、ebx、pc、ir...里面的数据保存一份(这个操作叫切走)。轮转后再次恢复进程时,OS会将最开始保存的寄存器里的数据恢复(这个操作叫切回),这时就能接着上次执行的位置继续执行。所有进程都有切走切回的操作,这样每次保存完上下文数据后,CPU就可以放心覆盖寄存器里面的数据了。

(5)TSS

每个进程都有一套自己的上下文数据,也叫寄存器数据。注意寄存器只有一套,而寄存器数据有很多。一套寄存器被多个进程共享使用,这也帮助实现了并发。

上下文数据(寄存器数据)保存在内存。我们可以简单理解为:进程的上下文数据保存到每个进程的PCB中的一个任务状态段的结构体TSS​​​​​​​就可以了,实际更加复杂。

在这里我们可以总结出:进程切换的核心是进程上下文数据的保存和恢复

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

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

相关文章

VS2022 Git功能的使用

前言 博主最近在学校接触了团队开发的概念,最近也系统性学习了c语言,也是从0开始摸索,一开始博主在推送代码的时候使用的是git bash 后来发现VS2022有Git相关功能,但是博主在网上没有找到通俗易懂适合小白的配置教程,…

HarmonyOS应用六之应用程序进阶一

目录: 1、UIAbility的冷启动和UIAbility热启动2、静态资源和动态资源的访问3、页面跳转3.1、页面返回跳转 4、HAR的ArkUI组件、接口、资源,供其他应用或当前应用的其他模块引用4.1、导出HAR的ArkUI组件4.2、引用HAR的ArkUI组件 5、循环渲染6、状态管理最…

【生成模型】学习笔记

生成模型 生成模型概述(通俗解释) 生成的核心是生成抽象化的内容,利用已有的内容生成没有的/现实未发生的内容。这个过程类似于人类发挥想象力的过程。 生成模型的应用场景非常广泛,可以应用于艺术表达,如画的生成、…

前端规范工程-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具,它们结合起来可以提供以下作用和优势: 代码格式化和风格统一: Prettier 是一个代码格式化工具,能够自动化地处理代码的缩进、空格、换行等格式问题,…

【PHP陪玩系统源码】游戏陪玩系统app,陪玩小程序优势

陪玩系统开发运营级别陪玩成品搭建 支持二开源码交付,游戏开黑陪玩系统: 多客陪玩系统,游戏开黑陪玩,线下搭子,开黑陪玩系统 前端uniapp后端php,数据库MySQL 1、长时间的陪玩APP源码开发经验,始终坚持从客户…

JAVA中的集合有哪些???

引言; Java 中的集合类主要分为两大类:Collection 接口和 Map 接口。前者是存储对象的集合类,后者存储的是键值对(key-value)。 (这是在IntelliJ IDEA中使用Diagram功能来操作绘制的UML类图) Set(实现类) HashSet: 基…

安全中心 (SOC) 与 网络运营中心 (NOC)

NOC 和 SOC 之间的区别 网络运营中心 (NOC) 负责维护公司计算机系统的技术基础设施,而安全运营中心 (SOC) 则负责保护组织免受网络威胁。 NOC 专注于防止自然灾害、停电和互联网中断等自然原因造成的网络干扰,而 SOC 则从事监控、管理和保护。 NOC 提…

《Windows PE》3.2.3 NT头-扩展头

■扩展头(可选标头仅限映像文件) OptionalHeader字段描述了可执行文件的更多细节和布局信息,如图像基址、入口点、数据目录、节表等。它的具体结构取决于文件的机器架构,可以是IMAGE_OPTIONAL_HEADER32(32位&#xff…

简单线性回归分析-基于R语言

本题中&#xff0c;在不含截距的简单线性回归中&#xff0c;用零假设对统计量进行假设检验。首先&#xff0c;我们使用下面方法生成预测变量x和响应变量y。 set.seed(1) x <- rnorm(100) y <- 2*xrnorm(100) &#xff08;a&#xff09;不含截距的线性回归模型构建。 &…

如何选择合适的跨境网络专线?

选择合适的跨境网络专线对于保障企业的国际业务顺畅运行至关重要。以下是一些选择跨境网络专线时可以参考的关键点&#xff1a; 服务商的信誉和经验&#xff1a;首先考察服务商的市场声誉和行业经验。一个好的服务商应该拥有良好的客户评价和成功案例&#xff0c;这表明他们有能…

心觉:如何抓住宇宙送来的运气和机会?

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作186/1000天 赚钱需要系统学习吗 你会发现生活中没什么学历&#xff0c;知道的也没你多&#xff0c;行动力也不一定有你强&#x…

【Orange Pi 5嵌入式应用编程】-用户空间GPIO控制

用户空间GPIO控制 文章目录 用户空间GPIO控制1、嵌入式Linux的GPIO子系统介绍1.1 sysfs文件访问GPIO1.2 通过字符设备访问GPIO1.3 库与工具2、RK3588的GPIO介绍3、用户空间操作GPIO编程3.1 硬件准备3.2 通过libgpio操作GPIO3.2.1 GPIO输出3.2.3 GPIO输入3.2.3 边沿事件检测(中断…

Tomcat监控与调优:比Tomcat Manager更加强大的Psi-Probe

这是一款 Tomcat 管理和监控工具&#xff0c;前身是 Lambda Probe。由于 Lambda Probe 2006不再更新&#xff0c;所以 PSI Probe 算是对其的一个 Fork 版本并一直更新至今。 Probe psi-probe是在相同的开源许可证(GPLV2)下分发的社区驱动的 Lambda Probe &#xff0c;psi-pro…

笔记整理—linux进程部分(4)进程状态与守护进程

进程的几种重要状态&#xff0c;就绪态&#xff1b;运行态&#xff1b;僵尸态&#xff1b;等待态&#xff08;浅度睡眠、深度睡眠&#xff09;&#xff1b;停止态。 就单核CPU而言&#xff0c;在同一时间只能运行一个进程&#xff0c;但实际上要运行的进程不止一个&#xff0c;…

手机实时提取SIM卡打电话的信令声音-(题外、插播一条广告)

手机实时提取SIM卡打电话的信令声音-(题外、插播一条广告) 前言 在去年的差不多这个时候&#xff0c;我们做了一遍外置配件的选型&#xff0c;筛选过滤了一批USB蓝牙配件和type-c转usb的模块。详情可参考《外置配件的电商价格和下载链接的选型.docx》一文&#xff1a;蓝牙电话…

Chainlit集成LlamaIndex并使用通义千问实现和数据库交互的网页对话应用(text2sql)

前言 我在之前的几篇文章中写了如何使用Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用&#xff0c;但是发现Langchain的几种和数据库交互的组件都不够让我满意&#xff0c;虽然已经满足了大部分场景的需求&#xff0c;但是问题还是很多&#xff0c;比如…

Frp服务部署

我这里使用的0.44版本部署如果有其他版本需求范我跟github自行下载 https://github.com/fatedier/frp/releases 相关中文文档可以查看 https://github.com/fatedier/frp/blob/dev/README_zh.md 为了方便我这里使用了同一台服务器部署的 如果需要内网穿透 Frps部署在公网 Frp…

亚洲市场|人工智能对固态硬盘SSD需求影响

随着人工智能(AI)技术的快速发展&#xff0c;对于高效能存储的需求也在日益增长。在亚洲市场中&#xff0c;固态硬盘(SSD)作为关键的数据存储设备&#xff0c;其重要性不言而喻。 扩展阅读&#xff1a; 内存&#xff1a;生成式AI带来全新挑战与机遇 这可能是最清晰的AI存储数…

数学语言符号汇总

&#xff08;任意&#xff09; &#xff08;存在&#xff09; 子集和真子集 一些集合关系符号的Latex写法&#xff1a; 的Latex写法为\not\subset 的Latex写法是\subsetneqq&#xff0c;否定式写法是\subseteqq 1&#xff09;子集 注意&#xff1a;子集只有两种&#xff1…

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程&#xff1f;如何使用php email服务&#xff1f; 无论是用户注册、密码重置&#xff0c;还是订单确认&#xff0c;电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能&#xff0c;并提供一些配置技巧&#xff0c;帮助你更好…