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
英文地址,請注明出處:http://en.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)定義:字段具有原子性,不可再分。數據表中每一列都必須是不可分割…