rt-linux下__slab_alloc里的另外一处可能睡眠的逻辑

一、背景

在之前的博客 tasklet上下文内存分配触发might_alloc检查及同步回收调用链
里,我们讲了一处内存分配时会引起睡眠的调用链(这个引起睡眠的这个调用链它是在普通linux里也是存在的)。这篇博客里,我们讲一处内存分配路径下在rt-linux下会出现睡眠的另外一处调用链。

我们在第二章里说明一下这处调用链,在第三章里,拓展说一下,rt-linux内核里的这种内存分配路径下的睡眠和唤醒逻辑所造成的一些调度有关的一些问题。

二、rt-linux下__slab_alloc里的另外一处可能睡眠的调用链

这个另外一处可能睡眠的调用链是一处使用锁的调用,在rt-linux下普通spinlock也是会引起睡眠的。

2.1 rt-linux下__slab_alloc里加锁的地方

rt-linux下__slab_alloc里的这另外一处可能睡眠的调用链所导致的一次warning的calltrace的打印里的部分调用链如下:

现在的内核版本基本都是使用的CONFIG_SLUB来代替CONFIG_SLAB,slub是基于slab核心实现的,slub改写自slob,是slob的优化后版本,比slab性能更好。如下图是内核文档里的相关说明:

所以,对应代码里是slub.c下的__slab_alloc函数,

在__slab_alloc函数里,还是明显地看到有使用锁的地方:

2.2 local_lock_irqsave在rt-linux里的实现

上图里的local_lock_irqsave虽然在普通内核里是会关抢占和禁用irq的,但是在rt-linux版本里,它是不会关抢占和禁用irq的,我们来看一下rt-linux里local_lock_irqsave的实现:

如下图local_lock_irqsave直接使用了__local_lock_irqsave:

rt-linux打开了CONFIG_PREEMPT_RT编译选项,所以,__local_lock_irqsave是调用的下图的逻辑:

即调用的__local_lock:

可以看到__local_lock会禁用migrate之外,就是调用的spin_lock,只是这个spinlock是一个per_cpu变量而已,实际调用流程和spin_lock是一样的。

要注意,这里只是禁用了迁移,抢占没有禁用,所以,在持锁期间,它是可能被抢占的。但是,更重要的是,在rt-linux的普通spinlock锁逻辑里,它会进行睡眠。

2.3 rt-linux里的spinlock里的rtlock_might_resched检查

在开启了CONFIG_PREEMPT_RT后,在rt-linux的spinlock_rt.c里的普通spinlock的核心逻辑__rt_spin_lock函数里,有如下的rtlock_might_resched的检查:

这个检查是为了在rt-linux里,避免在一些关中断/关抢占场景下,使用普通spinlock,检查的逻辑如下图在core.c里的__might_resched里:

这个检查是一个warning,但是实际上,如果看到这样的warning,就是说明有巨大的风险的,为什么这么说,因为,打印warning表示是在非预期的上下文下(关中断或关抢占)使用了rt-linux的普通spinlock。

假设,在关中断下,进入了rt-linux的普通spinlock锁里的睡眠的逻辑,也就是在关中断下调用了schedule函数,这是很明显的会导致系统错乱的情况,至于后面造成panic还是系统死锁都是有可能的。

三、rt-linux下内存分配逻辑引起的一些问题

在rt-linux下,除了要注意上面 2.3 里描述的在一些中断关闭或者抢占关闭的场景下使用可能睡眠的接口以外,还有不少因为rt-linux的普通spinlock锁有睡眠逻辑(有睡眠逻辑,自然就有相应的唤醒逻辑),从而导致一些性能有关的问题。

在之前的  博客里,我们讲到了rt-linux下的一个cgroup cpu的死锁问题 rt-linux下的cgroup cpu的死锁bug,还有rt-linux下的 rt-linux下的底层锁依赖因cgroup cpu功能导致不相干进程的高时延问题 。这里,对于rt-linux下的底层锁依赖,导致的不相干的进程之间的高时延问题,再做一定的说明。

3.1 内存分配路径下常见的两种锁导致的进程间的干扰

内存分配路径主要有两种锁,会产生这样的不相干进程之间的干扰,一种是在博客  里讲到的下图的唤醒关系:

还有一种是pre-cpu的锁导致的唤醒关系:

其实从上图里可以看到per-cpu的唤醒动作所发生的cpu和被唤醒任务锁在的cpu是同一个cpu,这其实在上面 2.2 里已经可以解释了,因为slab的分配所用的锁都是per-cpu的,自然相干扰的是同一个cpu上的任务。

但是,上面说的第一种,也就是一些全局的锁,从图里也可以看到,唤醒动作发生的cpu和被唤醒任务所在的cpu不是一个cpu:

3.2 除了slab分配时local_lock之间的干扰,还有lru_rotate锁及lru_lock锁

在上一节贴出的调用链里有lru_add_drain_cpu函数,lru_add_drain_cpu函数里有在执行pagevec_lru_move_fn前进入了lru_rotate.lock这个锁:

如上图看到lru_rotate.lock是一个local_lock,在rt-linux下也是会睡眠的,不过local_lock只涉及到同一个cpu上的影响。

对于不同cpu上的影响的锁是在上图里的pagevec_lru_move_fn函数里的逻辑:

也就是调用的folio_lruvec_relock_irqsave函数,folio_lruvec_relock_irqsave函数继而调用了folio_lruvec_lock_irqsave函数:

而folio_lruvec_lock_irqsave函数在打开memory cgroup时是如下实现:

使用的是lru_lock锁。

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

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

相关文章

基于STM32F103C8T6的智能环境监测系统:DHT11温湿度检测与OLED显示实现

引言 你是否曾想实时握身边环境的温湿度变化?无论是居家种植需要精准调控环境,还是实验室存放敏感材料需监控条件,亦或是智能座舱场景下的环境感知,智能环境监测系统正成为连接物理世界与数字管理的重要桥梁。而在众多嵌入式开发…

动态规划在子数组/子串问题

目录 一、最大子数组和(LeetCode 53) 二、环形子数组的最大和(LeetCode 918) 三、乘积最大子数组(LeetCode 152) 四、乘积为正数的最长子数组长度(LeetCode 1567) 五、等差数列…

微信小程序开发笔记(01_小程序基础与配置文件)

ZZHow(ZZHow1024) 参考课程: 【尚硅谷微信小程序开发教程】 [https://www.bilibili.com/video/BV1LF4m1E7kB] 009_文件和目录结构介绍新建页面与调试基础库 一个完整的小程序项目分为两个部分:主体文件、页面文件 主体文件又称全局文件,能够作用于整…

NLP Subword 之 BPE(Byte Pair Encoding) 算法原理

本文将介绍以下内容: 1. BPE 算法核心原理2. BPE 算法流程3. BPE 算法源码实现DemoBPE最早是一种数据压缩算法,由Sennrich等人于2015年引入到NLP领域并很快得到推广。该算法简单有效,因而目前它是最流行的方法。GPT-2和RoBERTa使用的Subword算…

CSS 伪类选择器

伪类选择器(pseudo-class selector)是一种用于选择HTML元素特定状态或特征的关键字,它允许开发者基于文档树之外的信息(如用户交互、元素位置或状态变化)来选择元素并应用样式。伪类选择器以冒号(:)开头,附…

Electron 新特性:2025 版本更新解读

引言:Electron 新特性在 2025 版本更新中的解读核心价值与必要性 在 Electron 框架的持续演进中,新特性的引入是推动桌面开发创新的核心动力,特别是 2025 年的版本更新,更是 Electron 项目从成熟生态到前沿技术的跃进之钥。它不仅…

MyBatis从入门到面试:掌握持久层框架的精髓

MyBatis从入门到面试:掌握持久层框架的精髓 前言 在Java企业级应用开发中,持久层框架的选择至关重要。MyBatis作为一款优秀的半自动化ORM框架,以其灵活的SQL定制能力和良好的性能表现,成为了众多开发者的首选。本文将带你从MyBa…

5.Three.js 学习(基础+实践)

Three.js 是 “WebGL 的封装库”,帮你屏蔽了底层的着色器 / 缓冲区细节,专注于 “3D 场景搭建”,开发效率高,是通用 3D 开发的首选。他的核心是 “场景 - 相机 - 渲染器” 的联动逻辑,先掌握基础组件,再学进…

消火栓设备工程量计算 -【图形识别】秒计量

消火栓设备工程量计算 -【图形识别】秒计量 消防系统的消火栓设备水枪、水带和消火栓组成,根据清单定额规则计算消火栓设备工程量。通过CAD快速看图的图形识别框选图纸就能自动数出消火栓数量,省时又准确,是工程人做消防算量的好帮手。 一、…

Docker 与 VSCode 远程容器连接问题深度排查与解决指南

Docker 与 VSCode 远程容器连接问题深度排查与解决指南 引言 Visual Studio Code 的 Remote - Containers 扩展极大地提升了开发体验,它将开发环境容器化,保证了环境的一致性,并允许开发者像在本地一样在容器内进行编码、调试和运行。然而&…

爱图表:镝数科技推出的智能数据可视化平台

本文转载自:https://www.hello123.com/aitubiao ** 一、✨ AI 图表:智能数据可视化好帮手 爱图表是镝数科技旗下的一款智能数据可视化工具,它能让复杂的数字和报表变得直观又好懂。接入了先进的DeepSeek 系列 AI 模型,它不仅会做…

ENVI系列教程(四)——图像几何校正

目录 1 概述 1.1 控制点选择方式 1.2 几何校正模型 1.3 控制点的预测与误差计算 2 详细操作步骤 2.1 扫描地形图的几何校正 2.1.1 第一步:打开并显示图像文件 2.1.2 第二步:启动几何校正模块 2.2 Landsat5 影像几何校正 2.2.1 第一步:打开并显示图像文件 2.2.2 第…

STM32-FreeRTOS操作系统-消息队列

引言在嵌入式开发领域,STM32与FreeRTOS的结合应用极为广泛。本文将探讨如何在STM32上使用FreeRTOS实现消息队列功能,助力高效任务通信与系统协作。消息队列定义消息队列是一种在 FreeRTOS 中用于任务间通信的机制。它允许任务将消息发送到队列中&#xf…

【开题答辩全过程】以 C语言程序设计课程网站为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

手机上有哪些比较好用的待办事项提醒工具

在快节奏的现代工作中,我们每天都要面对大量的任务与事务。从项目截止日期、客户会议,到日常的工作安排,琐碎的事项容易让人顾此失彼。 手机待办事项工具早已突破传统“记事本”的局限,成为移动办公场景下的效率核心。它们通过任务…

Mysql数据库事务全解析:概念、操作与隔离级别

MySQL系列 文章目录MySQL系列一、什么是事务1.1事务的核心概念1.2、 事务的四大属性(ACID)1.2.1 原子性(Atomicity)1.2.2 一致性(Consistency)1.2.3 隔离性(Isolation)1.2.4 持久性&…

【MCU EEPROM开发教程】

简单来说把eeprom芯片当成一个传感器来使用,通过IIC/SPI等协议对芯片进行读写操作,具体的读写操作涉及到一些算法—怎么样读写更加快速,以及一些异常错误处理。 应用场景: 对于一些掉电也不能丢失的数据要存在eeprom/flash中&…

Docker将镜像搬移到其他服务上的方法

导出/加载镜像(保留分层、标签)和导出/导入容器快照(仅文件系统,丢失镜像历史与标签)。 一、把镜像打包带走(推荐) 适合把一个或多个镜像搬到离线/内网机器,保留分层与标签。 在源服…

Ubuntu 系统安装 Miniconda 完整方法与注意事项

一、完整安装步骤 1. 下载 Miniconda 安装包 Miniconda 安装包为 .sh 格式脚本,下载途径分两种: 方式 1:浏览器下载(适合新手) 访问 Miniconda 官方下载页,选择对应系统版本(Ubuntu 选 Miniconda3-latest-Linux-x86_64.sh),默认保存到用户目录的 ~/Downloads 文件夹…

【后端】数据库四大范式详细解析

梳理一下 MySQL(或关系型数据库)中的第一、二、三、四范式,这是数据库设计中非常重要的规范化理论。1️⃣ 第一范式 (1NF:First Normal Form)定义:字段具有原子性,不可再分。数据表中每一列都必须是不可分割…