当前位置: 首页 > news >正文

【Linux】进程(8):Linux真正是如何调度的

大家好,我是苏貝,本篇博客带大家了解Linux进程(8):Linux真正是如何调度的,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

之前我们讲过,在大部分操作系统课本里面,进程的调度是将进程的pcb依次链入一个运行队列中,那Linux也是这样调度的吗?如果是这样的话,进程的优先级有什么用呢?

事实上,Linux调度不是将进程的pcb依次链入一个运行队列中。让我们来了解一下Linux是如何调度进程的

Linux系统中,每个CPU都有一个运行队列runquene
在这里插入图片描述

我们先看蓝色框框,nr_active: 总共有多少个运行状态的进程。
quene[140],它会为我们维护有140个队列的数组,它的完整结构是task_struct* queen[140]。Linux采用的是分时操作系统,在分时操作系统中,该数组只使用下标[100,139]这40个队列。你不觉得很巧合吗,Linux的优先级也有40个数字[60,99](默认的优先级是80,nice的范围是[-20,19])

下标为100的队列放的是优先级为60的进程,下标为101的队列放的是优先级为61的进程……下标为139的队列放的是优先级为99的进程(队列的下标和进程的优先级之间差40)
在这里插入图片描述

所以如果有一个优先级为60的进程,那么先加40=100,然后将进程链入下标为100的队列中,有多少进程就往后链入多少进程
在这里插入图片描述

所以如果我们想找到一个优先级为60的进程,那么直接+40=100,找到下标为100的队列,再从链入该队列的进程中一个一个往后找就可以了。可是如果我们想找一个进程,v它的优先级是80,,我们难道就要从下标为100的队列开始遍历,一直遍历到下标为120的队列才可以吗?

不需要。Linux中还为我们准备了bitmap[5],也是在蓝色框框里,它的完整结构是long bitmap[5]。为什么有5个元素呢?
在这里插入图片描述

为什么要与140比呢?不要将long理解成类型,将它理解为32个比特位,每个比特位都代表对应下标的队列中有没有链入进程,如果有,那么该比特位为1;如果没有,则为0。我们上面的图里只画了对应下标[100 ,139]的比特位。

可能有人会说了,那这不还是要遍历吗,看每一个下标对应的比特位是否为0?其实不用,我们可以32位一起查,如果bitmap[0]==0,说明前32个比特位全为0,所以对应下标的队列都没有进程。

Linux中以上述方法查找进程,它的时间复杂度几乎为O(1)

再来看红色框框,我们发现,红色和蓝色框框怎么是一样的?其实它们是同一个结构体的2个变量array[0]和array[1]

在这里插入图片描述

运行队列runquene中还有2个指针需要我们了解:active和expired。active指针默认指向array[0],expired指针默认指向array[1]。CPU在找进程的时候,不是直接访问array[0]或array[1]的quene[140]的,而是找到active指针,指针指向的是哪个,CPU就访问哪个的quene[140]。这么说,难道active指针还会变化,指向array[1]吗?是的,让我们接着往下看
在这里插入图片描述

假如此时active指针指向array[0],那么CPU调度进程时,就访问array[0]的quene[140],这时array[0]的quene[140]的队列只出不进:进程结束,就从CPU上剥离进程的pcb;时间片到了,不再链入本quene[140],而是链入另一个quene[140]对应的队列;如果有新的进程,那么也不再链入本quene[140],而是链入另一个quene[140]对应的队列
在这里插入图片描述

等到本quene[140]中没有进程了,就将active指向array[1],让empired指向array[0],CPU运行进程时,就访问array[1]的quene[140],此时它就变成了只出不进,另一个就是只进不出

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

相关文章:

  • Gradio.NET:一个快速制作演示demo网页的利器
  • 鸿蒙开发接口数据管理:【@ohos.data.preferences (首选项)】
  • 在Windows中使用svn的命令行
  • 【ARFoundation自学04】AR Tracked Image 图像追踪识别
  • 基于安卓的虫害识别软件设计--(1)模型训练与可视化
  • 关于安装typescript后运行tsc -v命令报错问题
  • idm2024最新完美破解版免费下载 idm绿色直装版注册机免费分享 idm永久激活码工具
  • HTML5 视频 Vedio 标签详解
  • 神经网络---网络模型的保存、加载
  • 分治算法例子
  • OceanBase v4.2 解读:tenant=all 语义优化,提升易用性
  • Java Web学习笔记4——HTML、CSS
  • PyTorch 的 torch.nn 模块学习
  • 正则表达式----IP地址合法性判断
  • 啵啵啵啵啵啵啵啵啵啵啵啵啵啵啵
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • ComponentOne 2017 V2版本正式发布
  • github指令
  • js面向对象
  • PHP面试之三:MySQL数据库
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 创建一个Struts2项目maven 方式
  • 构建二叉树进行数值数组的去重及优化
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端临床手札——文件上传
  • 少走弯路,给Java 1~5 年程序员的建议
  • 听说你叫Java(二)–Servlet请求
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • nb
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 数据可视化之下发图实践
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​Python 3 新特性:类型注解
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 飞书APP集成平台-数字化落地
  • #1014 : Trie树
  • (04)odoo视图操作
  • (C++20) consteval立即函数
  • (LeetCode) T14. Longest Common Prefix
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (多级缓存)缓存同步
  • (附源码)ssm码农论坛 毕业设计 231126
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三)elasticsearch 源码之启动流程分析
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Standard 的管理策略
  • .NET 中创建支持集合初始化器的类型
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .Net面试题4