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

        前言:本篇内容主要讲解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.rhkb.cn/news/381287.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智汇云舟:双引擎模式,为合作伙伴带来实在的利润和回报

2024年是智汇云舟新渠道政策的元年,今年上半年,智汇云舟基于视频孪生产品的升级,对合作伙伴的共创模式进行了升级,从以往的“渠道模式”升级为“合伙模式”,从而实现能力升级,为智汇云舟渠道业务的发展带来…

08 模型演化根本 深度学习推荐算法的五大范式

易经》“九三:君于终日乾乾;夕惕若,厉无咎”。九三是指阳爻在卦中处于第三位,已经到达中位,惕龙指这个阶段逐渐理性,德才已经显现,会引人注目;但要反思自己的不足,努力不…

ABAP打印WORD的解决方案

客户要求按照固定格式输出到WORD模板中,目前OLE和DOI研究了均不太适合用于这种需求。 cl_docx_document类可以将WORD转化为XML文件,利用替换字符串方法将文档内容进行填充同 时不破坏WORD现有格式。 首先需要将WORD的单元格用各种预定义的字符进行填充…

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

使用RNN进行情感分类:基于IMDB数据集的LSTM应用 引言 情感分析是自然语言处理(NLP)中的一个重要应用,广泛用于电影评论、社交媒体等文本数据的情感分类任务。本文将介绍如何使用递归神经网络(RNN)实现情感…

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式:我们的目标是使用IDEA编写lua脚本,所以不需要勾选。后面需要的话,可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…

基于Java的校园交友网站系统

你好,我是专注于计算机技术研究的学姐码农小野。如果你对校园交友网站系统的构建或者相关技术感兴趣,欢迎私信交流。 开发语言 Java 数据库 MySQL 技术 Java语言、SpringBoot框架、B/S结构 工具 MyEclipse、Navicat、Maven 系统展示 首页 个人…

Docker启动PostgreSql并设置时间与主机同步

在 Docker 中启动 PostgreSql 时,需要配置容器的时间与主机同步。可以通过在 Dockerfile 或者 Docker Compose 文件中设置容器的时区,或者使用宿主机的时间来同步容器的时间。这样可以确保容器中的 PostgreSql 与主机的时间保持一致,避免在使…

基于电鸿(电力鸿蒙)的边缘计算网关,支持定制

1 产品信息 边缘计算网关基于平头哥 TH1520 芯片,支持 OpenHarmony 小型系统,是 连接物联网设备和云平台的重要枢纽,可应用于城市基础设施,智能工厂,智能建筑,营业网点,运营 服务中心相关场…

网站及图片字体商用侵权怎么办

如果您的网站因为使用了商业字体而遭到举报,这可能意味着您未经授权就使用了受版权保护的字体,这构成了版权侵权。 boosstrap默认字体是否含商用字体? body {font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;font-size…

公司技术栈用到了RocketMQ,我对此块知识进行了回顾(初始RocketMQ)

前言 作为24届的校招生,不知道大伙儿们是否都已经到了工作岗位上。为了以后更方便的接触到公司的业务,我司为我们安排了将近一个月的实操。虽然不用敲代码,但是… 了解到我司使用到的技术栈,在空闲时间正好对RocketMQ这块技术做个…

金蝶云星空与金蝶云星空对接集成发货通知单查询打通库存状态转换单

金蝶云星空与金蝶云星空对接集成发货通知单查询打通库存状态转换单 数据源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台…

在RK3568上如何烧录MAC?

这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址:https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码:hm30 烧录过程: 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录,双击运行RKDevInfo…

Nexus3 批量上传 jar 包、pom文件

Nexus3 Maven 私服搭建及各种使用 详见**Maven私服搭建及各种使用汇总2020** Maven 配置 Nexus 私服 在 Maven 项目中配置 Nexus 私服,需要在项目的 pom.xml 或 maven 的 settings.xml 文件中添加 Nexus 仓库的配置。 示例: 以下是一个项目的 pom.xml…

车载音视频App框架设计

简介 统一播放器提供媒体播放一致性的交互和视觉体验,减少各个媒体应用和场景独自开发的重复工作量,实现媒体播放链路的一致性,减少碎片化的Bug。本文面向应用开发者介绍如何快速接入媒体播放器。 主要功能: 新设计的统一播放U…

Facebook Dating:社交平台的约会新体验

随着社交媒体的普及和技术的发展,传统的社交方式正在经历革新,尤其是在约会这个领域。Facebook作为全球领先的社交平台,推出了Facebook Dating,旨在为用户提供一个全新的约会体验。本文将探讨Facebook Dating如何重新定义社交平台…

Gettler‘s Screep World 笔记 Ⅰ

夏促时候刚刚入坑,写个笔记叭~ 环境配置 参考 HoPGoldy 大佬的简书,先配置下开发环境 萌新去看大佬的详细教程,我这里比较简单,有前端基础的可以直接抄 VSCode 跳过 node 我配的是v18.18.2 换源 npm config set registry h…

层次分析法模型【清风数模学习笔记】

视频学习:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 适用于:评价类问题 评价目标 可选方案 评价的准则 如何确定评价标准 题目 文献搜索(知网) 网站搜索…

【C语言】动态内存管理(上)

文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例(malloc和free) 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要,为…

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

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

汽车免拆诊断案例 | 2017 款林肯大陆车发动机偶尔无法起动

故障现象 一辆2017款林肯大陆车,搭载2.0T发动机,累计行驶里程约为7.5万km。车主进厂反映,有时按下起动按钮,起动机不工作,发动机无法起动,组合仪表点亮正常;多次按下起动按钮,发动机…