linux进程优先级——优先值、调度算法、进程性质

news2024/9/20 22:01:19

        前言:本篇内容主要讲解linux下进程的优先级。 优先级的内容相对较少, 最重要的内容就是cpu的调度方法。 内容相对容易理解。 

        ps:本节内容适合了解冯诺依曼和操作系统的管理方式以及进程PCB的友友们进程观看

进程的优先级是什么

        进程的优先级与进程的权限之间有什么区别——进程的权限指的是能不能被访问。 而进程的优先级指的是进程被访问的次序问题。

为什么要有进程的优先级

        因为cpu的空间归根结底还是寄存器, 而寄存器很小, 就注定了cpu的资源是有限的。 而进程的个数是多个的, 这就势必会导致进程之间的竞争关系!——之前提到了进程之间的独立性, 这次是竞争性, 关于进程之间的性质, 后续将会进行讲解。

        操作系统为了保证进程之间的良性竞争, 他就会确认进程之间的优先级。如果我们的进程长时间得不到cpu资源, 该进程的代码长时间得不到推进, 就会出现饥饿问题。——饥饿问题是什么? 比如我们运行一qq的时候, qq忽然没有相应了, 最后弹出一个弹窗,上面写着强行停止或者等待。这个时候, 其实就是qq长时间没有被执行, qq出现了的饥饿,这就是饥饿问题。 

怎样理解优先级

        优先级的查看就是ps al

        上面的PRI是进程的优先级, NI是nice值。PRI优先值越小, 优先级越高。PRI优先值越大, 优先级越小。

        下面是我们定义的一个程序:

        现在运行这个程序, 看一下进程的优先级:

        这个进程的优先值是20, nice值是0——这里的nice值是用来调整优先值的, nice值是0, 也就是说进程的优先值经过调整nice后是20。 如果这里的nice值是1,PRI是20,  那么就是说进程的优先值经过调整1后是20, 也就是说原本是19. ——而对于操作系统来说, 操作系统不可能让进程无限的调整优先值, 否则进程之间的运动顺序就会非常乱。 所以, 一般进程的nice值都有一个范围, 这个范围是[-20, 19]. 也就是说, 对于这个程序的优先值来说, 它的最大范围就是[0, 39]。

        现在看一下UID, UID是这个程序的拥有者的编号。 像上图的UID是1000, 就说明我们当前用户的编号也就是UID是1000. 

        而我们如何查看UID? 就是使用ls -n, 其中-n选项就是将文件夹的拥有者等换成对应的编号。

操作系统如何根据优先级展开调度

        首先, 对于cpu来说, cpu有一个runqueue, 我们知道, 进程都会链接到runqueue里面, 而runqueue是一个双链表。 那么对于cpu来说,是如何确认优先级呢?

        首先, 我们可以假设cpu里面的一个runqueue结构体, 里面的XXX指向即确认优先级即将执行的队列, YYY指向等待区(这个等待区是等待XXX全部执行完然后替换XXX, 具体接下来会讲到, 这个三言两语不好说清)的队列:

在上面两个指针数组里面, 0~99的内容是不用的,留给其他进程使用。 而100~139是正好40个元素, 这40个元素分别指向了一个对应的优先值。——我们知道, 进程的优先值的假如是80, 那么经过nice变换后, 变换的范围就是[60,, 99], 进程的优先级假如是60, 那么经过nice变换后, 变换的范围就是[40, 79]。 也就是说, 这些进程的优先值变化范围都是40, 正好对应了数组指针的40个元素。 ——在底层这些指针数组其实就是维护了一个个对应优先值的进程PCB, 如下图:

        上面进程的优先级的本质其实就是开散列哈希。 对于同一个优先级的进程先取离头部近的进程。 而之所以优先值越低, 进程的优先级越高的原因就是优先值对应指针数组的下标。 而下标越低, 地址越低, cpu越先取到。

        而运行队列里面维护者两个开散列哈希, 假设分别是XXX, YYY, 并且这两个开散列哈希都有一个指向他们的二级指针维护, 就比如下图:

        二级指针X用来维护XXX, 二级指针Y用来维护YYY数组。 而之所以要有两个指针数组, 是因为对于操作系统来说, 他要执行程序, 就必须先找到X, 然后再找到XXX, 进而找到指向的PCB, 然后执行队列里面进程。 之后再来新的进程的时候, 就放到等待队列里面。 等到XXX指向的数组的进程运行完毕之后, 就交换两个指针的内容。 也就是Swap(&X, &Y)。

        其中的调用细节就是使用了位图:bitmap映射XXX, YYY两个数组里面的所有元素。 只要这个元素有元素, 就将位图对应的比特位映射1, 否则映射0——这就是linux内核2.6版本的O(1)调度算法!

        所以, 我们知道, 运行队列的调度本质就是将进程的PCB按照优先级打散到XXX或者YYY的不同位置, 而位置的不同, 就意味着调度顺序的不同, 所以, 对于cpu来说, 就能使用调度算法根据进程的优先级调度这些进程了!

进程的各种性质

        竞争性:现在我们来看一下进程的竞争性, 为什么说队列具有竞争性,因为对于整个冯诺依曼来说, 内存里面的进程是非常的多的。而cpu只有一个, 而像那些底层硬件, 通常也只有一个或者几个。这些硬件的资源都是非常稀缺的, 那么就势必造成进程在硬件的等待队列里的时候一定要确认优先级。而确认优先级的本质就是在竞争。——这就是进程的竞争性。 

        独立性,进程在设计的时候, 就是按照进程之间互不影响进行设计的, 也就是说, 一个进程崩溃了,睡眠了, 运行了等等不会影响其他进程。 就比如我们现实生活中使用qq, qq崩溃了并不影响我们微信的运行。

        并行:并行是两个或者多个进程同时运行, 这个概念存在于cpu存在多个。 如果cpu有两个或者两个以上,那么每个cpu都有一个运行队列, 这些运行队列都会确认优先级, 然后根据O(1)的调度算法调度进程运行, 这就是并行。

        并发:对于并发来说, 并发是存在于一个cpu中, cpu对于多个进程根据时间片的规定按照运行队列确认优先级, 一次进行调度。 让不同的进程同时推进的过程, 这个过程就叫做并发——之所以会这样是因为对于cpu来说, 它的切换速度太快了, 纳秒级别, 我们人是感觉不到的。进程切换 + 时间片——》基于进程切换, 基于时间片轮转的调度算法。那么, 现在有一个问题, 对于时间片轮换调度来说, 如果一个进程执行完了那么它会被继续放到等待队列里面, 那么这就势必会造成这个进程又排到了那些没有被执行过的, 但是优先级很低的进程前面。 所以,为了防止出现饥饿问题,当一个进程时间到了后, 他不会放到调度队列里面——也就是上面的XXX, 而是放到等待队列里面——也就是YYY, 当XXX运行完了, YYY就变成调度队列, 对YYY里面的进程进程调度。 :

        

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

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

相关文章

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏

最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体,摩檫力0 轮胎添加碰撞体和刚体&#xff0…

CVE-2020-7248 OpenWRT libubox堆栈溢出漏洞复现(更新中)

提要 该文档会一直处于更新当中,当状态为完毕后,才是更新完成。由于网络上关于该漏洞原理的分析文档和资源实在是太少,而本人关于该方向也才是刚入门,能力有限,所以复现需要的时间较长,需要补充和学习的东西…

《从C/C++到Java入门指南》- 9.字符和字符串

字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符,所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…

Spring通过工厂方法进行配置

在Spring的世界中, 我们通常会利用 xml配置文件 或者 annotation注解方式来配置bean实例! 在第一种利用 xml配置文件 方式中, 还包括如下三小类 反射模式(我们前面的所有配置都是这种模式)工厂方法模式Factory Bean模…

跳妹儿学编程之ScratchJr(10):结束积木篇—放学回家

博主资深软件架构师,拥有13年大型软件与互联网系统开发、设计和架构经验,曾就职于华为,现任职于国内知名互联网公司。平时在家教咱家“跳妹儿”编程,并将心得和过程记录下来。希望可以帮助更多对编程感兴趣的家庭。 前言 继上一篇…

FastDFS分布式存储

文章目录 FastDFS原理FastDFS架构文件的上传文件的下载 FastDFS原理 FastDFS架构 Tracker server 跟踪服务器主要做挑度工作,起到均衡的作用,负责管理所有的Storage server和group Storage server 储服务器,主要提供容量和备份服务;以group为单位&…

VMware虚拟机下安装Ubuntu(详细教程,最小系统的安装,含VMware Tools)

1.VM的下载安装 VMware的下载安装教程_vm16 pro下载-CSDN博客 2. Ubuntu 下载 在官网或者镜像站下载所需版本的.ios镜像,这个镜像在接下来的步骤中会用到: Ubuntu 22.04.4 LTS 下载 和 清华大学开源软件镜像站 - Ubuntu 22.04.4 下载 3. 创建虚拟机 […

【开发实战】QT5 + OpenCV4 开发环境配置应用演示

前言 作为深度学习算法工程师,必须要掌握应用开发技能吗?搞工程肯定是必须要会界面开发,QT就是一个很不错的选择。本文以QT5.15 OpenCV4.8 OpenVINO2023为例,搭建应用开发环境,演示深度学习模型的QT应用案例。 开发…

重拾CSS,前端样式精读-函数(颜色,计算,图像和图形)

前言 本文收录于CSS系列文章中,欢迎阅读指正 在计算机编程中,函数有着重要的作用和意义,它可以实现封装,复用,模块化,参数等功能效果,在如何在CSS中写变量?一文带你了解前端样式利…

聊聊HuggingFace Transformer

项目组件 一个完整的transformer模型主要包含三部分:Config、Tokenizer、Model。 Config 用于配置模型的名称、最终输出的样式、隐藏层宽度和深度、激活函数的类别等。 示例: {"architectures": ["BertForMaskedLM"],"atte…

蓝屏死机不再怕!CrowdStrike故障修复指南中心上线!

系统之家于7月22日发出最新报道,安全公司CrowdStrike因其Windows更新引发全球 850 万台电脑蓝屏死机问题后,上线了全新的“修复和指南中心”(Remediation and Guidance Hub),该中心汇集了与其错误更新相关的详细信息&a…

昇思25天学习打卡营第25天 | RNN实现情感分类

学习心得:RNN实现情感分类 在自然语言处理(NLP)的领域中,情感分类是一个极具挑战性的任务,它要求模型能够准确地从文本中识别出情感倾向。通过使用MindSpore框架和RNN模型进行情感分类,我获得了许多有关构…

【QT】定时器事件 - QTimerEvent QTimer

qt 系统 - 定时器 定时器1. QTimerEvent2. QTimer3. 获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使用定时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执…

《python语言程序设计》第6章第1题数,数学方面:五角数n(3n-1)/2 前100个五角数

第4次做第6章 def getPentagonalNumber(n):count 0for i in range(1, n):count 1pen_num round(i * ((3 * i) - 1) / 2)print(f"{pen_num}", end" ")if count % 10 0:print()getPentagonalNumber(100)

Java语言程序设计基础篇_编程练习题**15.15 (几何问题:添加或删除点)

**15.15 (几何问题:添加或删除点) 请编写一个程序,让用户在面板上单击以自动创建或移去点(参见15-28a)。当用户左击鼠标时(主按钮),就创建一个点并且显示在鼠标的位置,用户还可以将鼠标移到一个点上,然后右击鼠标(次按钮)以移去这…

C语言-网络编程-UDP通信创建流程

UDP 通信创建流程 UDP 是⼀个传输层的⽆连接的协议,我们编写代码⼀般是分为两个端。⼀个我们称之为发送端,另⼀ 个我们称之为接收端。正常⼀般是接收端先运⾏,然后等待结束发送端发送过来的数据。 创建套接字 首先,我们需要创建…

JDK8升级到JDK17,报错Error:java:错误:不支持的发行版本5

1 问题描述: 我原来用到是JDK8,后来重新安装了JDK17后,并更换了JAVA_HOME的配置,在CDM上面查看JAVA版本确认安装无误。 当我打开IDEA运行代码时,就报错java:错误:不支持的发行版本5,至始至终我都…

Leetcode509. 斐波那契数(递归和常规两种写法)

问题描述: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),…

Python酷库之旅-第三方库Pandas(037)

目录 一、用法精讲 116、pandas.Series.div方法 116-1、语法 116-2、参数 116-3、功能 116-4、返回值 116-5、说明 116-6、用法 116-6-1、数据准备 116-6-2、代码示例 116-6-3、结果输出 117、pandas.Series.truediv方法 117-1、语法 117-2、参数 117-3、功能 …

C语言编译报错:error: expected declaration or statement at end of input(缺了括号)

文章目录 报错信息分析解决步骤: 排查 报错信息 /userdata/testOtherPrj/20240715_box_circuit_breaker/test/external/modbus_vendorA/src/vendor_a_modbus.c: In function ‘VendorA_PowerStop’: /userdata/testOtherPrj/20240715_box_circuit_breaker/test/exte…