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.mfbz.cn/a/843087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android11 framework 禁止三方应用开机自启动

Android11应用自启动限制 大纲 Android11应用自启动限制分析验证猜想:Android11 AOSP是否自带禁止三方应用监听BOOT_COMPLETED​方案禁止执行非系统应用监听到BOOT_COMPLETED​后的代码逻辑在执行启动时判断其启动的广播接收器一棍子打死方案(慎用&#…

【Spark官方文档部分翻译】RDD编程指南(RDD Programming Guide)

写在前面 内容如何选择 本翻译只翻译本人认为精华的部分,本人认为的Spark的一些核心理念,编程思想。一些特别基础的操作包括但不限于搭建环境就不在此赘述了。 配套版本 本系列基于Spark 3.3.1,Scala 2.12.10,进行翻译总结 原…

专业PDF编辑工具:Acrobat Pro DC 2024.002.20933绿色版,提升你的工作效率!

软件介绍 Adobe Acrobat Pro DC 2024绿色便携版是一款功能强大的PDF编辑和转换软件,由Adobe公司推出。它是Acrobat XI系列的后续产品,提供了全新的用户界面和增强功能。用户可以借助这款软件将纸质文件转换为可编辑的电子文件,便于传输、签署…

stm32:CAN通讯

目录 介绍 物理层​编辑 差分信号 总线网络 协议层 CAN的 帧/报文 种类 数据帧 远程帧(遥控帧) 错误帧 过载帧 帧间隔 总线仲裁 位同步 数据同步 波特率 stm32的CAN外设 工作模式 测试模式 功能框图 时序 标准时序 例子 环回静默…

应用层——HTTP

像我们电脑和手机使用的应用软件就是在应用层写的,当我们的数据需要传输的时候换将数据传递到传输层。 应用层专门给用户提供应用功能,比如HTTP,FTP… 我们程序员写的一个个解决我们实际的问题都在应用层,我们今天来聊一聊HTTP。 协议 协议…

游泳耳机哪个牌子最好?公认最好的四大游泳耳机测评分享

游泳耳机,作为水上运动爱好者的贴心伴侣,已被公认为提升水下体验的利器。然而,在抖音、贴吧等社交平台上,我们也不难发现一些关于游泳耳机性能不佳、使用效果差,甚至对耳朵造成不适的反馈。这种矛盾现象的出现&#xf…

HTML5大作业三农有机,农产品,农庄,农旅网站源码

文章目录 1.设计来源1.1 轮播图页面头部效果1.2 栏目列表页面效果1.3 页面底部导航效果 2.效果和源码2.1 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_4…

基于pytorch演练线性回归模型

引言 本文的目的是在前文基于numpy演练可视化梯度下降的代码基础上,使用pytorch来实现一个功能齐全的线性回归训练模型。 为什么仍然使用线性回归模型? 线性回归模型简单,它能让我们聚集在pytorch是如何工作的,而不是模型内部的…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

C++ | Leetcode C++题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:int missingNumber(vector<int>& nums) {int n nums.size();int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} };

探索 Framer Motion 高级动画技巧:提升前端设计水平

在现代的网页和应用设计中&#xff0c;动画不仅仅是视觉的点缀&#xff0c;更是用户体验的重要组成部分。它能够使界面更具吸引力&#xff0c;提升交互的流畅性&#xff0c;甚至在不经意间传达品牌的个性和态度。然而&#xff0c;要创造出令人惊叹的动效并不容易——直到有了 F…

Edge侧边栏copilot消失

Edge侧边栏copilot消失 当前环境 自己ip问题已解决&#xff0c;edge中已登录账号&#xff0c;地区已设置为美国&#xff0c;语言已设置为英文。具体可以通过空白页右上角的setting验证 解决方案 首先&#xff0c;打开“任务管理器”&#xff0c;在其中找到 Microsoft Edge…

【SASS/SCSS(三)】样式的复用与动态计算(@mixin和@function)

目录 一、mixin 1、定义复用的样式代码&#xff0c;接受传参&#xff0c;搭配include使用。 位置传参 关键词传参 ...语法糖接受传入的任意参数 2、在mixin中使用content&#xff0c;获取外部对mixin的追加内容 二、function 三、字符串——值得注意的点 很多时候&#…

[Doris]阿里云搭建Doris,测试环境1FE 1BE

首先&#xff1a;阿里云的国内服务器千万不要用容器搭建&#xff0c;或者自己Dockfile构建镜像。两种方式都不得行&#xff0c;压根拉不到github的镜像&#xff0c;开了镜像加速器也拉不到&#xff0c;不要折腾了&#xff0c;极其愚蠢。 背景&#xff1a;现在测试环境&#xff…

算法力扣刷题记录 五十六【501.二叉搜索树中的众数】

前言 二叉搜索树操作&#xff0c;继续。 记录 五十六【501.二叉搜索树中的众数】 一、题目阅读 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;…

【BUG】已解决:zipfile.BadZipFile: File is not a zip file

已解决&#xff1a;zipfile.BadZipFile: File is not a zip file 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

IAR环境下STM32+IAP方案的实现

--基于STM32F103ZET6的UART通讯实现 一、什么是IAP&#xff0c;为什么要IAP IAP即为In Application Programming(在应用中编程)&#xff0c;一般情况下&#xff0c;以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了&#xff0c;如果在设备使…

Day16_集合与迭代器

Day16-集合 Day16 集合与迭代器1.1 集合的概念 集合继承图1.2 Collection接口1、添加元素2、删除元素3、查询与获取元素不过当我们实际使用都是使用的他的子类Arraylist&#xff01;&#xff01;&#xff01; 1.3 API演示1、演示添加2、演示删除3、演示查询与获取元素 2 Iterat…

ros笔记03--从零体验ros2话题通信方式

ros笔记03--从零体验ros2话题通信方式 介绍创建步骤体验官方 talker listener 案例基于python开发发布订阅案例 注意事项说明 介绍 主题是 ros2 提供的三种主要接口方式之一&#xff0c;它通常被用于连续的数据流&#xff0c;如传感器数据、机器人状态等。 ros2 是一个强类型的…

Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案本方案的缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡…