【Linux】深入理解进程的优先级(Linux 2.6版本O(1)调度算法)

进程的优先级

  • 【前置知识】
  • 一、进程的优先级
    • (一)为什么要有优先级?
    • (二)进程的优先级的范围
  • 二、操作系统是如何实现进程的优先级?(Linux内核2.6版本O(1)调度算法)

【前置知识】

首先我们要了解什么是进程?知道什么是进程的PCB,可以查看我之前的文章什么是进程?

一、进程的优先级

(一)为什么要有优先级?

我们思考一下?为什么要有优先级?
本质:系统资源的不足,所有就必须要有优先级的出现解决这个问题。

就比如:我们去学校的食堂买饭,食堂肯定是有一个个的窗口,那么当我们学生的数量过多的时候,就需要到一个窗口去进行排队,出现这种现象的原因很简单,就是学校的食堂不够大,窗口不够多。
所以同样的道理,操作系统在调度进程的时候,由于CPU的资源有限,所以就决定了进程在被调度的时候,进程要进行排队,而排队就一定会有先后顺序,所以这个先后顺序就是进程的优先级。

(二)进程的优先级的范围

进程优先级范围:

  • 在Linux中,进程的优先级可以通过nice值进行调整,范围为[-20, 19],而不是[-19, 20]。
  • nice值越低,优先级越高,-20代表最高优先级,19代表最低优先级。

进程优先级是可以被修改的, PRI(new) = PRI(原)+ nice值,注意:这里的PRI(原)它都是默认按80为标准来进行计算的。

我们可以验证一下:

#include <iostream>
#include <unistd.h>

using namespace std;

int main()
{
    while(1){
        cout << "I am a process!" << endl;
        sleep(1);
    }
    return 0;
}

我们在XShell下运行这段代码,然后通过ps -al来查看这个进程的信息
在这里插入图片描述
PRI就是当前的优先级,NI是nice值
我们可以看到a.out就是我们的代码的可执行程序,它的PRI为80,然后我们通过top命令对它进行修改,详细步骤为

top,然后按r,然后输入进程的PID,然后输入nice值,这里我输入5
在这里插入图片描述
PRI被修改成5了,然后我再次修改,这次我修改nice值为10,按理来说应该是85 +10 = 95,但结果是90
在这里插入图片描述
这里就说明了,修改PRI都是以80为基础来进行修改的。

二、操作系统是如何实现进程的优先级?(Linux内核2.6版本O(1)调度算法)

首先我们知道,根据冯诺依曼体系结构决定,CPU要拿数据,就要从内存中拿数据,所以一个进程要被CPU调度,就要将进程的代码数据和它的属性(PCB)加载进内存里,然后CPU再进行调度。

而一个CPU通常一次只能调度一个进程,而操作系统里是有很多的进程需要被调度的,所以这就意味着,这些等待被调度的进程就要进行排队,而排队就要有先后的顺序,也就是进程的优先级,那么想到这里?我们就要思考它是如何排队的?

我们在前面也看到了,进程的优先级范围的调整是[-20, 19], PRI的数值越小,优先级就越高,而进程间会有相同优先级的进程,在什么是进程?那一篇博客里,我也说过了,进程在组织的时候,是按照双链表的结构进行组织起来的,所以我们可以大致的想象

每个PRI会对应着数组的某个下标位置,有一种映射的关系,那么每个数组下标的位置存放的会是一个个双链表,这种结构不就是我们数据结构里的哈希桶吗?
在这里插入图片描述
然后操作系统就依次从下标小的位置去拿出一个运行的队列出来,然后依次运行,这样就实现了一个进程优先级的现象。

那么实际上,操作系统是怎么做的?

调度队列:

  • Linux的调度器采用运行队列(runqueue)的概念。每个CPU有自己的runqueue,其中包含两个优先级数组:一个活动队列(active queue)和一个过期队列(expired queue)。
  • 运行队列中的每个优先级数组是一个链表数组,每个链表对应一个特定的优先级。调度器使用这些链表来管理具有相同优先级的进程。

实际上就是在CPU中,它管理着一个结构体runqueue,该结构体里有两个成员。

  • 一个活动队列,也就是当前CPU正在运行调度的队列。
  • 一个是过期队列,这个队列是把要新加入的进程就先放在这个队列里
    > 而这两个其实都是数组,数组大小是140个空间,其中前100个空间是操作系统要用的,有特殊用途,我们只能使用后40个数据空间,这就是为什么优先级只有40个范围

为什么要有这个过期队列呢?直接加入进活动队列里不就行了吗?

  1. 首先,一个CPU它如果既要运行我们对应的进程,如果没有过期队列,它是不是就还需要花费一些资源,去维护新加入进来的进程,这样不仅加大了管理的成本,也浪费CPU的资源,CPU资源是非常宝贵的。
  2. 其次,我们试想一下,在这种调度结构里,总是先把优先级高的执行了之后,再依次向下执行,那么如果有一些进程,它的优先级很低,但是对于操作系统而言,可能随时都会有新的进程到来,如果这些进程的优先级都比较高,那么低优先级的进程将会迟迟得不到被调度,造成饥饿问题。
  3. 如果我的CPU当前已经把该数组位置的进程链表都执行完了,执行到下一个优先级了,但是此时,又突然来一个刚才执行完的进程,需要我去执行,那么这时候我是又返回去执行,然后再去执行下一个进程的位置吗?那么这样子设计的成本是非常高的。

我们的操作系统是非常优雅的,它不会去浪费这些资源和精力去做这种事情。实际上CPU的runqueue,它里面有两个二级指针,分别指向活动队列数组和过期队列数组。
在这里插入图片描述
然后CPU运行活动队列,不需要管新加入的进程,统一将新加入的进程放到过期队列中,过期队列其实就相当于是活动队列的一个镜像,新加入的进程就根据优先级映射到对应的数组下标,然后添加进对应位置的哈希桶里面,当CPU把运行队列里的内容都执行完了。
> 这时候运行队列就是空的,然后只需要把那个二级指针,将它们交换一下所指向的内容,这样CPU立马就又得到了一个有数据的活动队列,然后此时又有了一个空的过期队列

这种处理方式是不是非常的优雅!
那么操作系统该怎么知道活动队列的内容为空呢?
有人说,判空还不简单吗?直接遍历一遍,看看哪里有数据不就好了吗?
但是这样线性遍历的时间复杂度是一个O(N)级别的,我们操作系统响应是非常快的,这显然不合适。

  1. 操作系统使用了位图的数据结构,来记录活动队列的每个下标的位置,低比特位就代表高优先级,也对应着低下标位置。
  2. 然后对应的比特位映射的数组下标位置如果有内容,就将它置为1,没有内容了就置为0,然后操作系统只需要通过位运算,就可以很快速的定位到哪些位置有内容。
  3. 从低比特位开始拿,拿最近的一个比特位为1的位置,这样也有了优先级的出现。
  4. 最后只需要判断这个位图的值是不是0,就能够知道活动队列是不是为空了。

综上所述,这种进程优先级的调度算法是Linux内核2.6版本引入的O(1)调度算法。Linux 2.4 及之前版本: 使用的是 O(n) 调度算法,调度器的时间复杂度与系统中进程的数量成线性关系。在进程数量较多时,调度效率较低。这种算法极大的提高了调度效率和系统的扩展性。

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

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

相关文章

【excel】设置二级可变联动菜单

文章目录 【需求】在一级菜单选定后&#xff0c;二级菜单联动显示一级菜单下的可选项【步骤】step1 制作辅助列1.列转行2.在辅助列中匹配班级成员 step2 名称管理器step3 制作二级下拉菜单step4 消除二级菜单中的空白 【总结】 之前做完了 【excel】设置可变下拉菜单&#xff…

导航时间与坐标转换

前言&#xff1a; 该章节代码均在Gitee中开源&#xff1a;因为这章是学校作业&#xff0c;所以稍微正经点. 时空位置转换https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/%E5%AF%BC%E8%88%AA%E6%97…

Idea-Linux远程开发部署

第一步&#xff1a;File->Remote Development 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a;在Host位置填写Linux虚拟机的IP地址&#xff0c;在Username、Password填写对应的账号密码后点击Test Connection测试连接。 第五步&#xff1a; 第六步&#xff1a;在…

【leetcode--文本对齐(还没整理完)】

根据题干描述的贪心算法&#xff0c;对于每一行&#xff0c;我们首先确定最多的是可以放置多少单词&#xff0c;这样可以得到该行的空格个数&#xff0c;从而确定该行单词之间的空格个数。 根据题目中填充空格的细节&#xff0c;我们分以下三种情况讨论&#xff1a; 当前行是…

Vue——样式绑定的几种方式

文章目录 前言往期回顾绑定对象绑定对象的另一种写法绑定数组数组与对象的嵌套 前言 样式绑定在vue中属于一种很常见的操作。在之前博客中针对样式的绑定操作&#xff0c;介绍了一个指令v-bind。缩写为:xxx。 vue 官网 样式绑定 往期回顾 先简单回顾下最开始绑定标签样式的操…

搭建gateway网关

1.创建springBoot项目 可以将Server URL换成start.aliyun.com 2.配置路由与跨域处理 路由&#xff1a; server:port: 10010 # 网关端口 spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- i…

Java的冷知识你知道吗?

1、方法参数不能超过255个 在Java中&#xff0c;方法的参数数量是有限制的&#xff0c;最多不能超过255个。这个知识点可能对于大多数程序员来说并不常用&#xff0c;因此即使是经验丰富的Java开发者也可能不清楚这一点。2、Java中的自动装箱与拆箱 自动装箱是Java 5引入的新特…

站点被篡改快照被劫持解决服务方法教程_一招制敌

站点被篡改快照被劫持解决服务方法教程_一招制敌 被篡改表现形式&#xff1a; 站点打不开或跳转到别的网站。 攻击者目的&#xff1a; 报复、勒索、卖防御产品&#xff08;如DDOS防御产品&#xff09;。 攻击成本&#xff1a; 工具&#xff08;如VPN购买&#xff09;成本、人…

当新手小白有了一块【香橙派OrangePi AIpro】.Demo

当新手小白有了一块【香橙派OrangePi AIpro】.Demo 文章目录 当新手小白有了一块【香橙派OrangePi AIpro】.Demo一、香橙派OrangePi AIpro概述1.简介2.引脚图 二、“点亮”香橙派OrangePi AIpro1.官方工具下载2.官方镜像下载3.镜像烧录4.访问香橙派 AIpro 三、香橙派OrangePi A…

数据结构第三篇【链表的相关知识点一及在线OJ习题】

数据结构第三篇【链表的相关知识点一及在线OJ习题】 链表链表的实现链表OJ习题顺序表和链表的区别和联系 本文章主要讲解关于链表的相关知识&#xff0c;喜欢的可以三连喔 &#x1f600;&#x1f603;&#x1f604;&#x1f604;&#x1f60a;&#x1f60a;&#x1f643;&#…

Dubbo 自定义 Filter 编码实例

Dubbo的Filter机制为我们做应用的扩展设计提供了很多可能性&#xff0c;这里的Filter也是“责任链”机制的一种实现场景&#xff0c;作为Java码农&#xff0c;我们也经常接触到很多责任链的实现场景&#xff0c;如Tomcat进入Servlet前的filter&#xff0c;如Spring Aop代理的链…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff01;除此之外&#xff0c;我们一同探究下该库还支持哪些新的特性…

自友科技破解走班教育排课难题

新高考后&#xff0c;校园教务都面临着晋级&#xff0c;其中走班教育的分班排课是个巨大的挑战。 所以在分班排课的时候要清楚一下几个问题 一是&#xff1a;清楚的核算学生的选考科目。学生选科提交后做好并承认&#xff0c;最好是在分班后不要改或很少的一部分人改动。 二是…

手写防抖debounce

手写防抖debounce 应用场景 当需要在事件频繁触发时&#xff0c;只执行最后一次操作&#xff0c;可以使用防抖函数来控制函数的执行频率,比如窗口resize事件和输入框input事件&#xff1b; 这段代码定义了一个名为 debounce 的函数&#xff0c;它接收两个参数&#xff1a;fn…

linux中最基础使用的命令

小白学习记录&#xff1a; 前情提要&#xff1a;Linux命令基础格式!查看 ls看目录的小技巧 进入指定目录 cd查看当前工作目录 pwd创建一个新的目录(文件夹&#xff09; mkdir创建文件 touch查看文件内容 cat、more操作文件、文件夹- 复制 cp- 移动 mv- 删除【危险操作&#xff…

Scrum 的速度如何衡量和提高

了解你的 Scrum 团队的实际开发速度是非常多敏捷团队的诉求&#xff0c;而速度&#xff08;Velocity&#xff09;作为敏捷项目的度量工具&#xff0c;为管理者提供了对团队工作能力深入了解的机会。 这份指南将深入探讨 Scrum 中速度的概念&#xff0c;指导你如何进行计算&…

cURL error 60: SSL certificate problem: unable to get local issuer certifica

本地小程序把接口换到本地的服务器接口&#xff0c;然后就报错了&#xff1a; cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) 经查询查到&#xff1a;此问题的出现是由于没有配…

5月更新!优维EasyOps®平台7大新功能上线~

5月&#xff0c;优维EasyOps全平台产品能力又升级啦&#xff01;&#x1f44f; 快来看看都有新增的功能与优化吧&#xff01;&#x1f447; 重点升级 架构可观测 1.系统监控态势感知 过去&#xff0c;用户在使用监控平台的过程中&#xff0c;存在如下问题&#xff1a; 告警…

基于单片机的超声波倒车雷达设计

摘 要&#xff1a;文 章设计了一种基于单片机的超声波倒车雷达系统&#xff0c;以 AT89C51 型单片机作为控制核心&#xff0c;集距离测量、显示&#xff0c;方位显示和危险报警于一体&#xff0c;以提高驾驶者在倒车泊车时的安全性和舒适性。本设计采用 Keil 软件对系统程序…

详解:重庆耶非凡的选品师项目有哪些优势?

在竞争激烈的电商市场中&#xff0c;重庆耶非凡科技有限公司凭借其独特的选品师项目&#xff0c;成功地在众多企业中脱颖而出。这一项目不仅体现了公司对市场趋势的敏锐洞察力&#xff0c;更彰显了其专业的选品能力和对消费者需求的深刻理解。 首先&#xff0c;耶非凡的选品师项…