【linux温故】linux调度机制

假如你是设计者,你会设计怎样的调度机制呢?

时间片

最简单的,小学生都能想出来的一种,每个 ready task,按照一个固定的时间片轮流执行。
大家不要抢,挨个儿排队执行。执行完时间片,就排在后面。

这个方案的问题很明显,就是实时性不佳。

就是一些高优先级的任务得不到及时处理。

很显然,得加入 优先级。

时间片轮转的可抢占优先级

加入优先级。

分为可抢占、不可抢占:

  • 不可抢占,就是当前的任务必须运行结束,才能调度下一个最高优先级的执行。显然,实时性有问题。
  • 可抢占,一旦有新的高优先级任务出现,就可以抢占当前任务,实时性比较好。

到目前位置,都没啥新奇的。

下面就开始放大招了。(2.4内核)

实时进程、普通进程

2.4 内核,采用一个 叫 goodness 的函数,来评估每个进程可运行的 “权重” wight 大小,选取权重最大的执行即可。

这里 linux 又将进程分为两类,实时进程、普通进程。
实时进程优先级理应很高,所以他的优先级直接 权重 +1000 的base, 然后加上实时进程内部的优先级。
普通进程的权重数量级为 几十 而已,但是它的权重计算比较复杂,涉及到动态优先级和静态优先级。

动态优先级、静态优先级

所谓的动态优先级,就是 当前进程 时间片还剩多少个单位(counter),很好理解,就是还没开始运行的任务,优先级肯定比 已经运行了一段时间的任务优先级高。毕竟出于公平的原则,大家都得得到运行的时间才对。

这个counter 值,没消耗完一个时间片,就会被 减1.

所谓的静态优先级,就是一个 叫 nice 的整数,表示一个程序的谦让程度(-20 ~ 19),这玩意比较微妙,数值越大,表示约“谦让”,也就是优先级越低,这个是 nice 值,是创建任务的时候就定下来的,所以叫 “静态”优先级。

goodness

基于上面的综合因素考量,2.4内核的 goodness 函数如下,计算出来的 weight,是评判调度顺序的唯一标准:
在这里插入图片描述
伪代码逻辑很清晰:
就是先判断进程的类型,如果是 实时的,优先级非常非常高。直接 weight 1000 开外了,然后再加上实时进程各自的优先级。

接下来才是 普通的进程,先看动态优先级,如果 count 值为0 ,也就是时间片用完了,那也直接退出,优先级设置为最低的 -1.
否则呢,先做个微调:
if (p->mm == this_mm || !p->mm)
这句话的意思是说:p->mm 如果为NULL,说明该进程无需用户空间(比如内核线程),则无需切换到用户空间,如果 p->mm == this_mm,说明该进程的用户空间就是当前进程的用户空间。该进程完全有可能得到运行。对于上述两种情况,需要适当给一些奖励,因为他们的进程切换开销比较小。比较适合得到调度。

最后,我们通过:
weight += 20 - p->nice,加入静态优先级 nice,越 “谦让”,这个 weight 就越小。

至此,我们就能根据 goodness 计算出每个 进程的 weight 值,从大到小运行即可。

2.6内核的优化

上面 2.4内核 的调度策略有个最大的问题,就是只有一个 就绪队列。对于时间片已经为 0 的,依然存在于就绪队列中,显然这是不合理的(时间片耗尽的,就应该滚出去先),如果这个队列很长,光遍历一遍就会耗费很多时间,对于一些硬实时场景,不太适合。

于是 2.6 内核采用了一种优化,设计了两个队列,一个 active 队列,一个 expired 队列:
在这里插入图片描述
看上面的解释,很容易理解了。

这样就解决了单就绪队列导致的遍历时间过长的问题。

后来

等 2.6.23 之后,就采用了 CFS 调度器去调度普通进程了,实时进程还是用之前的办法。

待续。。。

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

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

相关文章

并行计算导论 笔记 1

目录 并行编程平台隐式并行超标量执行/指令流水线超长指令字处理器 VLIW 内存性能系统的局限避免内存延迟的方法 并行计算平台控制结构通信模型共享地址空间平台消息传递平台对比 物理组织理想并行计算机并行计算机互联网络网络拓朴结构基于总线的网络交叉开关网络多级网络全连…

Java的值传递与“引用传递”辨析

目录 Java的值传递与“引用传递”辨析1. 传递方式概述2. 值传递示例3. “引用传递”示例4. 值传递与"引用传递"的实际应用5. 总结:java只有值传递 Java的值传递与“引用传递”辨析 欢迎来到本博客,今天我们将深入研究Java中是值传递还是引用传…

本地运行多种大语言模型:一行代码即可完成 | 开源日报 No.167

ollama/ollama Stars: 33.5k License: MIT ollama 是一个轻量级、可扩展的本地语言模型构建和运行框架。 提供简单的 API 用于创建、运行和管理模型包含丰富的预构建模型库,方便在各种应用中使用支持从 GGUF、PyTorch 或 Safetensors 导入自定义模型可以通过命令行…

【维生素C语言】附录:strlen 函数详解

写在前面:本篇将专门为 strlen 函数进行讲解,总结了模拟实现 strlen 函数的三种方法,并对其进行详细的解析。手写库函数是较为常见的面试题,希望通过本篇博客能够加深大家对 strlen 的理解。 0x00 strlen函数介绍 【百度百科】str…

科普:工业物联网的八个模块,一看就明白了。

工业物联网(Industrial Internet of Things,IIoT)是将传感器、设备、网络和云计算等技术应用于工业领域的物联网应用。它由多个模块构成,这些模块协同工作,实现对工业设备和系统的监测、控制和优化。以下是工业物联网常…

【前后端的那些事】2万字详解WebRTC + 入门demo代码解析

文章目录 构建WebRTC需要的协议1. ICE2. STUN3. NAT4. TURN5.SDP WebRTC通讯过程1. 大致流程2. 详细流程3. 核心api3.1 RTCPeerConnection3.2 媒体协商3.3 重要事件 代码编写1. 什么是websocket2. 消息实体类Message3. 业务流程图4. 搭建前后端环境5. join -- handleJoin -- jo…

LLM少样本示例的上下文学习在Text-to-SQL任务中的探索

导语 本文探索了如何通过各种提示设计策略,来增强大型语言模型(LLMs)在Few-shot In-context Learning中的文本到SQL转换能力。通过使用示例SQL查询的句法结构来检索演示示例,并选择同时追求多样性和相似性的示例可以提高性能&…

Mysql-数据库压力测试

安装软件 官方软件 安装插件提供了更多的监听器选项 数据库驱动 数据库测试 配置 这里以一个简单的案例进行,进行连接池为10,20,30的梯度压测: select * from tb_order_item where id 1410932957404114945;新建一个线程组 新增一个连接池配置 新建一…

深入理解Go的垃圾回收机制

导语 如果你是一位Golang的开发者,你一定对于语言特性和详细结构有所了解。但是,你是否曾经停下来深入研究过Golang背后复杂而强大的垃圾回收(GC)机制?在这篇文章中,我们将具体深入探讨Golang垃圾回收机制…

Linux操作系统基础(七):Linux常见命令(二)

文章目录 Linux常见命令(二) 一、kill命令 二、ifconfig命令 三、clear命令 四、重启与关机命令 五、which命令 六、hostname命令 七、grep命令 八、|管道 九、useradd命令 十、userdel命令 十一、tar命令 十二、su命令 十三、ps命令 Linu…

中科大计网学习记录笔记(九):DNS

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

华为云ModelBox实战:体感小游戏应用实操

目录 一、VsCode插件注册ModelBox设备二、Windows SDK安装1.安装Git for Windows2.下载ModelBox SDK3.相关插件安装 三、体感小游戏应用开发1.技能模板使用2.AI应用示例3.体感小游戏体验 参与华为云活动【HCSD】ModelBox实战营邀请活动,呼朋唤友学AIoT,完…