Linux进程管理:(九)实时调度

文章说明:

  • Linux内核版本:5.0

  • 架构:ARM64

  • 参考资料及图片来源:《奔跑吧Linux内核》

  • Linux 5.0内核源码注释仓库地址:

    zhangzihengya/LinuxSourceCode_v5.0_study (github.com)

实时指的是一个特定任务的执行时间必须是确定的并且可预测的,在任何情况下都能保证任务的最大执行时间限制。通常实时分成软实时和硬实时两种。

  • 软实时:仅仅要求事件响应是实时的,并不要求任务必须在多长时间内完成,大多数情况下要求的是统计意义上实时,不需要100%达到实时,如视频播放器,偶尔不能在限定时间完成任务也是能接受的。
  • 硬实时:对任务的执行时间的要求非常严格,无论在什么情况下,任务的执行时间必须得到绝对保证,否则将产生灾难性后果,如飞行控制器等。

1. 实时延时分析

假设Linux操作系统已经打开了内核抢占功能,即配置了CONFIG_PREEMPT宏。当外设中断发生后,我们需要唤醒进程A来响应这个事件,从中断发生到进程A开始执行之间的这段延时,我们称为实时延时(T0-T4),如下图所示:

在这里插入图片描述

  • 在T0时刻,进程A处于睡眠等待状态(TASK_INTERRUPTIBLE),外设中断发生,从中断发生到Linux内核响应之间有一个延时,称为中断延时(T0-T1)。产生中断延时的原因:

    • 发生中断时,Linux内核正处于关中断的状态,如正在spinlock_irq()spin_lock_irqsave()的临界区里执行,因此本地处理器将无法立刻响应这个中断,如下图所示:

      在这里插入图片描述

    • 中断控制器的调度延时。现代的中断控制器支持中断优先级调度和抢占,因此,它可能会被高优先级中断抢占。

  • 在T1时刻,CPU响应了这个中断,Linux内核的中断处理分成了上半部和下半部。上半部处理会很快完成,而且没有其他中断打扰,但是下半部是在开中断情况下执行的,可能被其他中断打断。如下图所示,在处理完中断A的上半部之后,其他外设中有中断发生,CPU转向处理其他中断了,这样延时处理中断A的下半部。我们把开始响应中断到这个中断完全处理的这段时间称为中断处理延时(T1-T2)。

    在这里插入图片描述

  • 在T2时刻,中断处理完成,唤醒进程A。从唤醒进程到进程被调度器选中的这段延时称为调度延时(T2-T3)。产生调度延时的主要原因如下:

    • 中断发生时Linux内核正在自旋锁临界区里执行。这样,中断完成之后不能马上抢占调度,必须等到Linux内核执行完成自旋锁临界区才能抢占调度,如下图所示。自旋锁临界区是关闭内核抢占的,当退出自旋锁临界区时会打开内核抢占并且尝试抢占当前进程。

      在这里插入图片描述

    • 调度器选中进程A的时间也是不确定的,可能就绪队列中有比进程A优先级更高的进程。

  • 在T3时刻,调度器选中了进程A,还需要进程上下文切换后才能执行进程A,即上下文切换延时(T3-T4)。

  • 在T4时刻,进程A终于等到了执行的机会。

2. Linux内核实时性改进

早在2001年时,Robert Love 就给 Linux 内核打上了抢占补丁,所以Linux内核支持可抢占已经有十几年的时间了。如果Linux内核不支持抢占,那么进程只能在如下条件下进行调度

  • 进程主动要求调度,如调用schedule()或者cond_resched()等
  • 在系统调用、异常处理和中断处理完成返回用户空间前夕进行调度

上述条件都导致了早期Linux内核的调度延迟非常大。而在支持可抢占的内核中

  • 如果唤醒动作发生在系统调用或者异常处理上下文中,在下一次调用preempt_enable()时会检查是否需要抢占调度。preempt_enable()函数会主动调用__preempt_schedule()来判断是否需要抢占当前进程。
  • 中断处理返回前会检查是否要抢占当前进程。注意,这里是中断处理返回,而不是用户空间返回,二者之间是有很大区别的。

抢占的相关源码如下所示:

struct thread_info {...union {// 当为 0 时,表示内核可以被安全抢占// 当大于 0 时,则禁止抢占u64		preempt_count;...};
};// 用于关抢占,给 thread_info 数据结构中的 preempt_count 成员加 1
#define preempt_disable() \
do { \preempt_count_inc(); \barrier(); \
} while (0)// 用于打开抢占,给 thread_info 数据结构中的 preempt_count 成员减 1,然后程序会判断其是否为 0,
// 如果为 0,则调用 __preempt_schedule() 函数完成调度抢占
#define preempt_enable() \
do { \barrier(); \if (unlikely(preempt_count_dec_and_test())) \// 判断是否需要抢占当前进程__preempt_schedule(); \
} while (0)

内核仅仅支持可抢占调度,要达到硬实时系统(hard real-time systerm)的要求还远远不够,为此社区中有一群人致力于Linux内核的实时性优化和改进。最近几年有很多优化的补丁己经添加到了官方Linux内核中,如下表所示:

在这里插入图片描述

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

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

相关文章

分布式商业模式是企业提升新质生产力、重塑生产关系的关键(附分布式商业模式设计六要素)

本文内容摘自思二勋所著的《分布式商业生态战略》一书。 如今,数字化转型如火如荼,数字化给予很多企业和个人网络化、生态化、协同化发展机会。一种基于网络的分布式商业模式或将为企业高效率、低成本开展工作提供新的路径。 数字化技术的成熟带来了万…

火鹰论文工具推荐 #职场发展#知识分享

《火鹰论文工具推荐》 在当今学术界和科研领域,写作是不可或缺的一环。为了保证自己的论文质量,我们经常需要借助一些工具来帮助我们提高效率和质量。其中一款非常好用、靠谱、方便、能用的工具就是火鹰论文。 火鹰论文是一款专业的论文写作工具&#x…

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌:每个人抓的牌放到哪里: 源码具体实现cardcardsTest 个人简介:努力学编程 每日鸡汤:stay foolish,stay hungry-史蒂芬.乔布斯斯…

深入探索C语言动态内存分配:释放你的程序潜力

🌈大家好!我是Kevin,蠢蠢大一幼崽,很高兴你们可以来阅读我的博客! 🌟我热衷于分享🖊学习经验,🏫多彩生活,精彩足球赛事⚽ 🌟感谢大家的支持&#…

JetBrains数据库驱动下载失败解决方法

本方法可通用于解决PyCharm等JetBrains家的IDE下载数据库驱动问题。 在Jet家IDE内连接数据库时,mysql、sqlite等的驱动有部分在 https://download.jetbrains.com 网站上,可能由于网络问题无法访问。 解决方法是修改 JetBrains 路径下的 jdbc.drivers.xm…

波奇学Linux:网络套接字

domain:ipv4 还是ipv6 type:面向字节流还是... 虚拟机 云服务器禁止直接bind公网ip 服务器可以有多个ip,如果只绑定一个ip,只能收到来自一个ip的信息 任意地址绑定 关于port的问题 [0,1024]:系统内定的端口号,一般要用固定的应…

eth 交易案例分析9

交易hash: 先用0.26eth买入了多个GPT,然后用这多个GPT 在uniswap3 兑换了1.69 个eth, 疑问点:买入的 DLP 什么意思?

YOLO算法改进Backbone系列之:CAT

Transformer广泛应用于NLP后,在CV领域也引起了广泛关注,但是将单词token替换为图像的patch使得Transformer计算量大幅增加。本文提出一种新的注意力机制Cross Attention,不再计算全局注意力而是将注意力的计算局限在patch内部来捕获局部信息&…

米多论文可靠吗 #知识分享#微信

米多论文是一个非常好用、靠谱的论文写作工具,同时也是一个查重降重的工具。它的便捷性和高效性让许多学生和研究者受益匪浅。 首先,米多论文提供了大量的模板和参考资料,为用户提供了丰富的写作素材和参考,能够帮助用户快速完成论…

Linux--Ubuntu安装【保姆级教程】

Linux操作系统时程序员必须要学的操作系统。接下来我们就来看一下Linux操作系统是如何安装的 我们在 Vmware 虚拟机中安装 linux 系统,所以需要先安装 vmware 软件,然后再 安装 Linux 系统。 一.所需安装文件: Vmware 下载地址(现在最新版的…

IPMI开源库pyghmi基本使用

简介:Pyghmi是一个纯Python(主要是IPMI)服务器管理库。IPMI(Intelligent Platform Management Interface,智能平台管理接口)是一种开放的标准,旨在帮助系统管理员在本地和远程管理服务器系统。而…

国际品牌交期长 雷卯来帮忙

在当今的电子元器件市场中,防静电电子元器件的需求日益增长。无论是通信安防、医疗、消费类电子、照明行业、航空航天还是汽车电子等领域都会使用到防静电产品,使得防静电电子元器件的需求也呈现出爆发式的增长。在这一市场中,雷卯品牌凭借其…