【Linux】:Linux 2.6内核 调度队列和调度原理

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux 2.6内核 调度队列和调度原理,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 调度队列

2. 调度原理

2.1 优先级

2.3 active指针和expired指针

2.4 活动队列和过期队列 

2.5 bitmap(位图)

2.6 总结


1. 调度队列

一个CPU拥有一个runqueue

但是如果有多个CPU就要考虑进程个数的负载均衡问题(先不考虑这个)

2. 调度原理

2.1 优先级

先看runqueue,可以看到里面有一个queue[140],其实它完整的是

task_struct * queue[140]

是一个PCB指针数组,里面的每个位置都可以指向一个进程PCB!

实时优先级:0 ~ 99 (先不关心这个)

普通优先级:100 ~ 139(我们都是普通优先级)

那么普通优先级为什么是100 ~ 139呢?我们可以根据在进程优先级中每个进程的nice值结合在一起看;

Linux进程的默认优先级是80,nice值的取值范围在-20 ~ 19,所以我们Linux进程的优先级范围在60 ~ 99,一共是40个优先级,100 ~ 139也是40个优先级,所以在queue这个指针数组中的后40个位置就是我们Linux进程PCB优先级排队链接的地方!(数组下标就是优先级)

2.3 active指针和expired指针

如果我们细心观察可以发现:在runqueue中存在两个queue[140]数组,这是为什么呢?

进程是根据优先级进行调度的,如果在一个queue中,有一个优先级为60的PCB,还有一个80的PCB在排队,所以CPU在调度的时候,首先肯定会调度优先级为60的PCB,此时如果我们不断的添加更多的优先级为60的进程,就会一直调度60的PCB,那么优先级为80的PCB就会陷入进程饥饿,那么此时的CPU调度进程的公平性如何体现?

  • 所以在runqueue中维护了两个queue[140],然后让active指针指向一个queue[140],再让expired指针指向一个queue[140];
  • OS在调度的时候会优先调度active指针指向的queue,此时如果有新的进程创建,并不会直接插入到active指向的queue中,而是插入到expired指向的queue中进行优先级的排队;
  • 当active指向的queue中的PCB调度完了,此时就将active和expired指向的内容进行交换,然后继续调度active指向的queue,此时就不会出现上面的进程饥饿问题。

2.4 活动队列和过期队列 

  • nr_active:总共有多少个被调度的进程PCB;
  • active指针指向的queue[140]就叫做活动队列;
  • expired指针指向的queue[140]就叫做活动队列。

2.5 bitmap(位图)

当我们在活动队列调度PCB的时候,是需要遍历找还是否存在可以调度的PCB的,粗暴一点的方法就是从前往后遍历的找,这种方式是比较费时间的,每次调度都要寻找,太麻烦了,所以就引入了一个新的结构:int bitmap[5]

根据比特位与字节的换算,bitmap中一共可以标志160个位置,我们都知道位图的查找时间复杂度是O(1),但是需要的就是消耗了一点空间,一种空间换时间的算法,主要的是保证了CPU调度PCB的效率。

2.6 总结

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!

 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!   

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

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

相关文章

做抖店需要截流吗?聊下抖店的出单玩法和运营思路

我是王路飞。 做抖店需要截流吗? 关于抖店的玩法,一直都是众说纷纭,谁都想发表点自己的意见。 尤其是很多新手,可能以前接触过淘宝等传统电商,对截流等玩法有个基本了解,就认为抖店是不是也是这样玩的。…

使用Flask ORM进行数据库操作的技术指南

文章目录 安装Flask SQLAlchemy配置数据库连接创建模型类数据库操作插入数据查询数据更新数据删除数据 总结 Flask是一个轻量级的Python Web框架,其灵活性和易用性使其成为开发人员喜爱的选择。而ORM(对象关系映射)则是一种将数据库中的表与面…

免费开源人脸识别系统,支持RESTful API

简介 CompreFace 是一个免费开源的人脸识别项目,您不需要具备机器学习技能就能安装设置和使用 CompreFace,官方提供了基于 docker 的部署方法,可以方便地部署在本地或者云端服务器上。 CompreFace 提供了 RESTful API,用于人脸识别…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目,将每一步详细的做出来。(如果有不足或者建议,也希望大佬们指出哦) 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目,大家看着创建吧,只要能创建…

C++、与C语言的一些变化、新增的一些函数类型、面向对象程序设计的基本特点

C 面向对象的编程思想 万物皆对象 类库: MFC Qt opencv opengl cout:标准输出流对象 endl:换行符 新的数据类型 bool型:逻辑真假—— true、false 变量的存储类型 auto:变量在定义时由编译器自动推到…

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

JVM(7):虚拟机性能分析和故障解决工具之jstat工具

1 jstat(JVM Statistics Monitoring Tool)作用 监视虚拟机各种运行状态信息,可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据 2 命令格式 jstat [options vmid [interval[count]]] 参数解释 第一个参数:options 代…

谷歌插件编写

目录 manifest.json {"manifest_version": 3,"name": "Floating Ball","version": "1.0","description": "A floating ball on the right side of the webpage.","permissions": ["act…

C语言 数组——计算最大值的函数实现

目录 计算最大值 计算最大值的函数实现 应用实例:计算班级最高分​编辑​编辑 返回最大值所在的下标位置 返回最大值下标位置的函数实现​编辑 一个综合应用实例——青歌赛选手评分​编辑​编辑​编辑​编辑​编辑 计算最大值 计算最大值的函数实现 应用实例&…

hcia datacom学习(8):静态NAT、动态NAT、NAPT、Easy IP、NAT server

1.私网地址 在现实环境中,企业、家庭使用的网络是私网地址(内网),运营商维护的网络则是公网地址(外网)。私网地址是在局域网(LAN)内使用的,因此无法被路由,不…

多线程讲解(详解)

目录 什么是多线程? 为什么要使用多线程? 线程的创建 使用Thread实现 从以上代码我们梳理一下多线程创建步骤: 注意: 小示例 首先,引入依赖 然后,按照我们刚刚说的构建多线程的步骤进行构建&#…

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接: NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

医学科技查新中对查新点的撰写方法!附案例讲解!

我国的科技查新工作最早是从医学领域开始的,始于1985年中国科学院医学情报所,后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分,其中医学立项查新,它是指在医学科研项目申报开题之前&#xff0c…

Wondershaper网络限制脚本源码分析一(下载速度限制篇)

Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比&…

python基础之开发工具配置

day01-Python基础 一、Python介绍 Python是一个计算编程语言,可以实现计算程序开发,也可以用于数据处理。SQL语言只能用于结构化数据的处理。Python的比SQL应用更广泛。 1990年推广Python,最初是应用于运维开发,随着不断更新迭代…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE(XML External Entity Injection)是一种攻击技术,它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置,攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域,PLC工程师扮演着至关重要的角色,他们负责构建、维护自动化系统,推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段,每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

ffmpeg中AVCodec是否需要手动销毁?

在开发到退出一个视频播放功能时,看到对AVCodec*这个指针做了初始化,但是突然有一个好奇的疑问,这个AVCodec到底是否需要人工手动销毁? 我在初始化的时候这样用的: const AVCodec *v_codec NULL; AVCodecContext *v…

从零到一建设数据中台 - 应用场景及实施路径

从零到一建设数据中台 - 应用场景及实施路径 一、数据中台技术场景 异构数据源集成、交换场景:实现异构数据源的整合集中和交换共享数据治理场景:从元数据角度实现企业级数据目录管理、保证数据质量、数据安全,提供数据血缘、数据服务数仓、…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境:vps,centos7,python3。 近期写了个python程序,用青龙面板在centos上运行。程序中有while无限循环,但是我在青龙中设置了定时任务(每隔半小时运行一次),于是造成了进程中有多个…