内核抢占和低延迟

Linux内核之内核抢占 1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope我们或许经常听说过内核抢占,可是我们是否真正理解它呢?内核抢占和抢占式内核究竟有什么关系呢?抢占计数器究竟干什么用?… 本文我们就来好好讨论下,关于内核抢占的一些技术细节,力求让大家理解内核抢占。注:本文主要关注CFS调度类。2.内核抢占和抢占式内核我们经常使用uname -a命令能看到“PREEMPT”的字样,没错,我们使用的是抢占式内核。 阅读详情

2.8.3 内核抢占和低延迟相关工作(2)

如果可以抢占,则需要执行下列步骤:

 
  1. kernel/sched.c   
  2. do {  
  3.         add_preempt_count(PREEMPT_ACTIVE);  
  4.  
  5.         schedule();   
  6.  
  7.         sub_preempt_count(PREEMPT_ACTIVE);  
  8.         /*  
  9.         * 再次检查,以免在schedule和当前点之间错过了抢占的时机。  
  10.         */  
  11. } while (unlikely(test_thread_flag(TIF_NEED_RESCHED))); 

在调用调度器之前,抢占计数器的值设置为PREEMPT_ACTIVE。这设置了抢占计数器中的一个标志位,使之有一个很大的值,这样就不受普通的抢占计数器加1操作的影响了,如图2-30所示。它向schedule函数表明,调度不是以普通方式引发的,而是由于内核抢占。在内核重调度之后,代码流程回到当前进程。此时标志位已经再次移除,这可能是在一段时间之后,此间的这段时间供抢先的进程执行。

 
图2-30 进程的抢占计数器
此前我忽略了该标志与schedule的关系,因此必须在这里讨论。我们知道,如果进程目前不处于可运行状态,则调度器会用deactivate_task停止其活动。实际上,如果调度是由抢占机制发起的(查看抢占计数器中是否设置了PREEMPT_ACTIVE),则会跳过该操作:
 
  1. kernel/sched.c   
  2. asmlinkage void __sched schedule(void) {  
  3. ...  
  4.         if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {  
  5.                 if (unlikely((prev->state & TASK_INTERRUPTIBLE) &&  
  6.                                 unlikely(signal_pending(prev)))) {  
  7.                         prev->state = TASK_RUNNING;  
  8.                 } else {  
  9.                         deactivate_task(rq, prev, 1);  
  10.                 }  
  11.         }  
  12. ...  
  13. } 

这确保了尽可能快速地选择下一个进程,而无需停止当前进程的活动。如果一个高优先级进程在等待调度,则调度器类将会选择该进程,使其运行。

该方法只是触发内核抢占的一种方法。另一种激活抢占的可能方法是在处理了一个硬件中断请求之后。如果处理器在处理中断请求后返回核心态(返回用户状态则没有影响),特定于体系结构的汇编例程会检查抢占计数器值是否为0,即是否允许抢占,以及是否设置了重调度标志,类似于preempt_schedule的处理。如果两个条件都满足,则调用调度器,这一次是通过preempt_schedule_ irq,表明抢占请求发自中断上下文。该函数和preempt_schedule之间的本质区别是,preempt_ schedule_irq调用时停用了中断,防止中断造成递归调用。

根据本节讲述的方法可知,启用了抢占特性的内核能够比普通内核更快速地用紧急进程替代当前进程。

2. 低延迟

当然,即使没有启用内核抢占,内核也很关注提供良好的延迟时间。例如,这对于网络服务器是很重要的。尽管此类环境不需要内核抢占引入的开销,但内核仍然应该以合理的速度响应重要的事件。例如,如果一网络请求到达,需要守护进程处理,那么该请求不应该被执行繁重IO操作的数据库过度延迟。我已经讨论了内核提供的一些用于缓解该问题的措施:CFS和内核抢占中的调度延迟。第5章中将讨论的实时互斥量也有助于解决该问题,但还有一个与调度有关的操作能够对此有所帮助。

基本上,内核中耗时长的操作不应该完全占据整个系统。相反,它们应该不时地检测是否有另一个进程变为可运行,并在必要的情况下调用调度器选择相应的进程运行。该机制不依赖于内核抢占,即使内核连编时未指定支持抢占,也能够降低延迟。

发起有条件重调度的函数是cond_resched。其实现如下:

 
  1. kernel/sched.c   
  2. int __sched cond_resched(void)   
  3. {   
  4.         if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE))   
  5.                 __cond_resched();   
  6.                 return 1;   
  7.         }  
  8.         return 0;  
  9. } 

need_resched检查是否设置了TIF_NEED_RESCHED标志,代码另外还保证内核当前没有被抢占 ,因此允许重调度。只要两个条件满足,那么__cond_resched会处理必要的细节并调用调度器。

如何使用cond_resched?举例来说,考虑内核读取与给定内存映射关联的内存页的情况。这可以通过无限循环完成,直至所有需要的数据读取完毕:

 
  1. for (;;)  
  2.         /* 读入数据 */  
  3.         if (exit_condition)  
  4.                 continue;  

如果需要大量的读取操作,可能耗时会很长。由于进程运行在内核空间中,调度器无法象在用户空间那样撤销其CPU,假定也没有启用内核抢占。通过在每个循环迭代中调用cond_resched,即可改进此种情况。

 
  1. for (;;)  
  2.         cond_resched();  
  3.         /* 读入数据 */  
  4.         if (exit_condition)  
  5.                 continue;  

内核代码已经仔细核查过,以找出长时间运行的函数,并在适当之处插入对cond_resched的调用。即使没有显式内核抢占,这也能够保证较高的响应速度。

遵循长期以来的UNIX内核传统,Linux的进程状态也支持可中断的和不可中断的睡眠。但在2.6.25的开发周期中,又添加了另一个状态:TASK_KILLABLE。 处于此状态进程正在睡眠,不响应非致命信号,但可以被致命信号杀死,这刚好与TASK_UNINTERRUPTIBLE相反。在撰写本书时,内核中适用于TASK_KILLABLE睡眠之处,都还没有修改。

在内核2.6.25和2.6.26开发期间,调度器的清理相对而言是比较多的。 在这期间增加的一个新特性是实时组调度。这意味着,通过本章介绍的组调度框架,现在也可以处理实时进程了。

另外,调度器相关的文档移到了一个专用目录Documentation/scheduler/下,旧的O(1)调度器的相关文档都已经过时,因而删除了。有关实时组调度的文档可以参考Documentation/scheduler/ sched-rt-group.txt。

Linux: lock: preempt_disable; CONFIG_PREEMPT_COUNT;CONFIG_PREEMPT 摘要:本文分析了Linux内核中的preempt_disable()函数,指出其当前实现仅作为编译器屏障(barrier)使用,已失去原有的抢占禁用功能。文章追溯了相关commit历史,解释了在UP(单处理器)和非抢占内核中,该函数仅需保证编译器不重排代码顺序。同时介绍了配置选项PREEMPT的作用,它通过允许内核代码被抢占来降低延迟,适用于桌面和嵌入式系统。最后阐述了preempt_disable/enable的正确使用场景,包括保护关键代码段、实现原子操作等,并给出了工作队列中的实际应用示例。 阅读详情

相关推荐

performance-tuning:性能调整调整高并发低延迟内核调整sysctl.conf

性能调整 性能调整/调整/高并发/低延迟/内核调整/故障排除/ sysctl.conf 请访问获取内容!

内核抢占和低

2.8.3 内核抢占和低延迟相关工作(2) 如果可以抢占,则需要执行下列步骤: kernel/sched.c   do {          add_preempt_count(PREEMPT_ACTIVE);           schedule();            sub_preempt_count(PREEMPT_ACTIVE);          /*          * 再

su_linux的专栏 383

确定中断和抢占延迟的嵌入式实时内核.pdf

确定中断和抢占延迟的嵌入式实时内核.pdf

【性能】Linux服务器低延迟技术

总的来说,我打算分两篇文章讨论相关低延迟技术: 1)系统调优(本文):一些低延迟相关的Linux系统设置,和一些原则。 2)网络调优:使用solarflare网卡降低网络IO延迟。 这里不打算介绍用户空间的延迟优化,因为太广泛了,另外我之前的文章也分享一些解决某类问题的低延迟类库。 说到Linux的低延迟技术,一个不能不提的词是"kernel bypass",也就是绕过内核。 (为什么呢?因为内核处理不仅慢而且延迟不稳定。可以把操作系统想象成一个庞大的框架,它和其他软件框架并没有什么本质的不.

我的笔记本 2090

Linux模拟网络丢包与延迟的方法

netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等等。 tc 是 Linux 系统中的一个工具,全名为traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

Ubuntu 18.04 安装低延时内核

Ubuntu 18.04低延时内核安装

Eng_ingLi的博客 799

在安装之后使用labelme出现qtpy.PythonQtError:No Qt bindings could be found错误

我在base环境(python3.7)可成功安装和使用labelme,而在同py37版本和py36的虚拟环境中可安装labelme包,但在使用的时候出现报错,如下: 我尝试着去解决第一个错误提示,错误提示为:moduleNotFoundError:No module named ‘PySide’,结果掉入了一个无止无尽的坑,看到网上有朋友说这个只能在py27-py35才能安装,还有说需要VC+ 140等,他们说的这个解决方案只针对于这个缺包的描述,而我们仅仅只需要一个labelme,因此我直接对后面的错误

qq_33538651的博客 9814

Linux 内核的五大创新

导读 在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大物。 撇开营销和模式不谈,Linux 可以说是开源世界中最受欢迎的内核,它在近 30 年的生命时光当中引入了一些真正的规则改变者。 Cgroups(2.6.24) 早在 2007 年,Pau...

llawliet0001的专栏 340

STM32N6实战:FSBL引导XIP运行ThreadX与NetX Duo

在嵌入式系统开发中,程序的存储与执行方式直接影响启动速度和系统实时性。传统MCU常将代码拷贝到内存运行,而高主频处理器则可通过XIP(片外Flash原地执行)技术直接从外部存储取指,省去拷贝过程。但XIP的前提是外部存储器控制器需在上电后第一时间完成初始化,这正是FSBL(第一级引导程序)的核心职责。FSBL负责配置时钟与外部Flash,并将控制权移交给应用。而要让设备具备实时调度与网络能力,可搭配ThreadX实时内核和NetX Duo双协议栈,两者在CubeMX中原生集成,形成一套高性能MCU+外部存储

weixin_29191669的博客 318

【大模型应用开发-FastAPI框架】(八)Sqlalchemy+postgresql简单增删改查

语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于。社区中成为广泛使用的ORM工具之一,不亚于Django的ORM框架。和declarative等可选插件可以让用户使用声明语法。SQLAlchemy首次发行于2006年2月,并迅速地在。SQLAlchemy“采用简单的。二、安装postgresql。一、SQLAlchemy简介。的数据映射模型,而不是其他。

2098

linux 内核工作延迟机制-softirq-tasklet

tasklet

qq_42931917的博客 729

AUTOSAR进阶图解==>AUTOSAR_EXP_VFB

AUTOSAR虚拟功能总线(VFB)摘要 AUTOSAR虚拟功能总线(VFB)是汽车开放系统架构中的核心抽象概念,为分布式电子系统提供统一通信模型。VFB允许软件组件在不了解底层物理通信机制的情况下交互,通过运行时环境(RTE)实现组件间的数据交换。系统配置过程将抽象的VFB视图转换为具体实现,包括组件到ECU的映射和通信机制选择。VFB采用"last-is-best"语义进行数据通信,并支持模式管理机制,使组件能根据系统状态调整行为。此外,VFB还支持与非AUTOSAR系统的交互,通常

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1116

内核抢占和低延迟相关工作

http://book.51cto.com/art/201005/200920.htm 《深入Linux内核架构》第2章进程管理和调度,在本章中,读者已经了解到进程是Linux的一个非常重要和基本的抽象。用于表示进程的数据结构与内核中几乎每个子系统都有关联。本节为大家介绍内核抢占和低延迟相关工作。 作者:郭旭 译来源:人民邮电出版社|2010-05-20 09:19 收藏 分享 2.8.3 内核...

hbcbgcx的博客 331

深度解析机器人关节位置环控制:从理论到实践

本文系统阐述了机器人关节位置环控制的核心原理与实现方法。首先介绍了关节控制的基础框架,阐明位置环在闭环控制中的关键作用。随后深入解析PID控制算法原理,包括比例、积分、微分项的功能与参数整定原则。在软件实现部分,提供了模块化设计思路和Python伪代码示例,强调实时性保障和异常处理机制。文章还包含典型面试问题解答和应用案例,展示如何通过参数优化将定位精度提升20倍。最后指出未来发展趋势将聚焦算法自适应性和系统稳健性。全文兼顾理论深度与实践指导,为开发者提供从基础到进阶的完整技术路线图。

郑伟强dev的专栏 49

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 638

Linux内核架构浅谈29-Linux内核抢占:实现原理与低延迟优化

本文解析Linux内核抢占机制,从不可抢占到可控抢占的演进过程。内核抢占通过抢占计数器、安全点检测等机制,在保证数据结构一致性的前提下,显著降低内核态延迟。文章详细介绍了抢占触发机制、临界区保护方法,以及可抢占内核、条件重调度等进阶优化手段,并提供了构建低延迟内核的配置建议。内核抢占实现了性能与实时性的平衡,是Linux支持软实时场景的关键技术。

文石_2009的博客 895

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux内核实时化:低延迟与可抢占补丁的原理、对比与工程实践

实时操作系统(RTOS)的核心在于提供确定性的任务调度与极低的响应延迟,以满足工业控制、汽车电子等对时序要求严苛的场景。其技术原理主要围绕如何保证高优先级任务能够及时抢占CPU执行,从而将内核延迟控制在微秒级。这一技术价值在于,它使得通用、生态丰富的Linux系统能够应用于硬实时领域,极大地拓展了其应用边界。在嵌入式开发中,面对实时性需求,开发者常需在内核层面进行优化,其中低延迟补丁(Low-Latency Patch)与可抢占内核补丁(Preemptable Kernel Patch)是两种经典的基础方案

weixin_33895695的博客 370

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

抢占式内核和非抢占式内核的区别

内核抢占(可抢占式内核):即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。 非抢占式内核:高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核 抢占式内核的意义:首先,这是...

li5830的博客 3318

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入理解Linux内核之内核抢占

1.开场白环境:处理器架构:arm64内核源码:linux-5.11ubuntu版本:20.04.1代码阅读工具:vim+ctags+cscope我们或许经常听说过内核抢占,可是我们是否真...

嵌入式Linux 2254

Linux 5.12的新特性:一份内核二进制文件支持多种内核抢占模型

Linux 5.12在2021年4月25日发布了,引入一个新特性:一份内核二进制文件支持多种内核抢占模型,允许在启动和运行时选择内核抢占模型。如果要使用这个新特性,那么需要在编译内核的时候...

Peter的专栏 1564

Linux 内核揭秘:实时内核(RT_PREEMPT),低延迟补丁的实现

在工业自动化、机器人控制、音频处理等领域,系统对响应时间的要求达到毫秒甚至微秒级。普通Linux内核由于存在不可抢占的临界区,可能导致任务延迟高达数百毫秒,无法满足实时性需求。RT_PREEMPT(Real-Time Preemption)补丁通过重构内核抢占机制,将延迟降低至微秒级,使Linux具备硬实时能力。 ## 内核抢占机制的演进 Linux内核抢占机制经历了三个阶段: 1. **无抢占...

gitblog_01093的博客 961

深入Linux内核架构-进程管理和调度(十三)—调度器增强

一、调度器增强 到目前为止,只考虑了实时系统上的调度。事实上, Linux可以做得更好些。除了支持多个CPU之外,内核也提供其他几种与调度相关的增强功能。请注意,这些增强功能大大增加了调度器的复杂性,主要考虑简化的情形,目的在于说明实质性的原理,而不考虑所有的边界情形和调度中出现的奇异情况。 1、SMP调度 多处理器系统上,内核必须考虑几个额外的问题,以确保良好的调度。 CPU负荷必须尽可...

xiezhi123456的博客 558

抢占式内核与非抢占式内核

2013-02-06 10:433269人阅读评论(3)收藏举报 分类: 【OS】(4) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] UNIX采用抢占式内核,Linux采用非抢占式内核 内核抢占(可抢占式内核):即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核...

weixin_34256074的博客 106

Linux RT 内核 (2) - 工作原理

Linux PREEMPT_RT

JiMoKuangXiangQu的专栏 54
上一篇: 内核抢占和低
下一篇: shell 去掉^M
独角鲸
博客等级 码龄16年 24粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值