在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么要把軟中斷鎖放到更底層去呢?

Linux閱碼場 ? 來源:Linux閱碼場 ? 2023-08-24 09:04 ? 次閱讀

大內核鎖(BKL)現在已經成為了一個遙遠的記憶,但在那么多年里,它都是內核開發社區面臨的一項棘手問題。然而 BKL 的終結并不意味著內核沒有其他有問題的鎖。近來,已經有一些關注轉向了軟中斷鎖(software-interrupt lock)或“下半部鎖”(bottom half lock),因為它可能會在實時系統上導致延遲。Frederic Weisbecker 正在采取最新行動來減小這個鎖的影響范圍,該方法就是基于移除 BKL 時所采取的方法。

最初,Linux 內核是在單處理器系統上開發的 —— 當然可以理解,因為那時我們手頭只有這種系統 —— 因此,代碼在很大程度上基于這樣的假設:它在 CPU 上運行,完全不存在其他的 CPU。于是 BKL 最終需要被引入,才能讓 Linux 能夠運行在那些產業分析師向我們保證的未來將會大行其道的多處理器機器上。它確保了只有一個 CPU 在任何給定時間內運行內核代碼,從而避免了各種并發問題,但是顯著地犧牲了性能,尤其是隨著 CPU 數量的增加而更加明顯。人們很快意識到 BKL 必須被移除。

在許多子系統中采取的方法是將 BKL 下移至系統的更底層級別。不再是在調用每個驅動程序的 open()函數時就申請持有 BKL,而是修改每個驅動程序來自行獲取 BKL。然后,open()函數可以在不持有 BKL 的情況下安全地得到調用了,每個驅動程序可以在需要時進行獨立的審查(audit)和修復,之后可以刪除其對 BKL 的使用。這種把 BKL 下移的動作將一個大問題分解成了許多較小且更易處理的問題。經過多年的努力,BKL 終于在 2011 年被移除了。

軟中斷(software interrupt)是一種延后執行的方法,用于執行一些是緊急但又無法直接在硬件中斷上下文中執行的工作。當有這種工作要做時,子系統會通過設置一個 flag 來觸發軟中斷;這會使得在下一個合適的時機會調用其處理程序,通常是在硬件中斷處理完成后就立即調用,或在從系統調用返回到用戶空間之前調用。如果處理時間過長,相關處理也可以推送到專門的 ksoftirqd 線程中。

軟中斷有許多使用者,包括 tasklets、網絡、塊設備子系統、讀-拷貝-更新(RCU)以及內核定時器。在某些工作場景中,軟中斷處理可能成為 CPU 總負載的一個重要部分;它可能會運行相當長的時間,從而對運行在用戶空間中的軟件導致延遲。會禁用軟中斷處理的那些內核代碼(為了避免與處理程序的產生 race condition)會變成不可搶占的,這也會導致出現不太愉快的延遲。總之,與 BKL 一樣,軟中斷反映了幾十年前很適用但是現在存在問題的一種設計。

其中一個設計上的決策是,軟中斷處理程序需要互斥;在任何給定的 CPU 上,只能執行一個軟中斷處理程序。因此,如果塊設備的軟中斷處理程序運行時間很長,那么網絡和定時器處理程序可能就會被無限期地延遲。即使不同類型的軟中斷處理程序之間很少出現競爭,情況仍然是如此。沒有確切的方法可以確定同時運行兩個處理程序是否安全,因此人們不會這樣做。

Weisbecker 的 patch set 旨在通過在定時器子系統中采用 BKL 方式的遷移到更底層實現的方法來解決這個問題。定時器函數會在內核的各個地方被放到隊列里等待調用;它們往往是互相獨立的,與其他軟中斷處理程序并不會產生并發問題。幾乎所有的定時器函數都可以與其他軟中斷處理完全并發地運行 —— 但是這里說的是“幾乎”。在沒有確定每個定時器函數的安全性的情況下,使定時器處理完全獨立于軟中斷處理可能會引入很難調試的問題。

相反,Weisbecker 采取了分成兩步的方法來增加定時器處理的并發性。第一步是允許單個軟中斷向量在不完全禁用軟中斷處理的情況下被禁用。這個 patch set 的目的是允許定時器函數與其他軟中斷并發運行,但它們仍然不會跟彼此并發運行。通過禁用定時器事件的處理(在本地 CPU 上),定時器處理程序可以安全地重新啟用軟中斷處理,而無需擔心會再次調用它。

第二步是允許單個 timer 函數來通知到定時器(timer)子系統,說它們可以跟其他軟中斷處理并發運行。任何不會與軟中斷處理程序競爭、或者在需要時得執行自己的軟中斷禁用代碼的定時器函數,都可以在設置其定時器事件時添加 TIMER_SOFTINTERRUPTIBLE flag 來標記。當定時器子系統看到此標志時,就會在該定時器函數運行時重新啟用軟中斷處理。因此,如果出現更重要的工作的話,這個 timer 函數就可以被搶占。

在 patch set 中只有一個定時器函數 process_timeout()是以這種方式標記的。然而,Weisbecker 期待著“幾年后”的一天內核的所有定時器函數都已經過 audit,并可以安全地與軟中斷處理程序并發運行;在那時,將可以完全從軟中斷機制中移除定時器處理。這樣以來就是朝著最終消除軟中斷的一個小步驟。

顯然,需要進行相當多的工作才能達到這一點。即使這個 patch set 也需要“更多微調”,以使可以中斷的 timer 函數能夠搶占其他軟中斷處理程序,這是解決問題的重要部分。但是,如果這項工作能夠進入 mainline 的話,它可能就能代表著朝著這個方向邁出了一步。Weisbecker 現在已經嘗試了幾次解決軟中斷的問題,但沒有取得太大的成功。然而最終,就像 BKL 一樣,正確的方法將會被找到,長期存在的問題終將得到解決。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19455

    瀏覽量

    231364
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10921

    瀏覽量

    213208
  • 定時器
    +關注

    關注

    23

    文章

    3256

    瀏覽量

    115486
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21763
  • 軟中斷
    +關注

    關注

    0

    文章

    8

    瀏覽量

    3058

原文標題:LWN:把軟中斷鎖放到更底層去!

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請問TC39x如何將變量放到自定義的段中去呢

    哪位知道如何將變量放到自定義的段中去呢?__attribute__ ((section(\".MySec\")))const tU32 M_A1 = 0
    發表于 01-31 08:18

    已解決_緊急救助-如何把貼片元件放到底層

    本帖最后由 lsergao 于 2013-3-29 07:53 編輯 我把一個貼片元件雙擊選擇放到底層,怎么打印底層沒有焊盤啊,請高手指點,我是一個新手
    發表于 03-28 16:39

    轉第16章 FreeRTOS調度,任務中斷

    第16章 FreeRTOS調度,任務中斷本章教程為大家講解調度,任務
    發表于 09-01 07:45

    第11章 臨界段,任務中斷

    轉rtx操作系統 本章教程為大家講解幾個重要的概念,臨界段,任務中斷。本章教程配套的例子含Cortex-M3內核的STM32F103和Cortex-M4內核的STM32F407。11.1 臨界
    發表于 10-04 19:58

    面向嵌入式Linux系統的中斷設計與實現

    本文在分析標準Linux 內核的中斷機制的演化以及實現原理的基礎上,提出并實現了一個面前嵌入式Linux 系統的中斷技術。該技術為嵌入式系統開發提供一個統一的
    發表于 08-03 11:20 ?16次下載

    中斷程序設計

    實 驗 五  中斷程序設計 一、實驗目的    通過對中斷程序的編寫和調試,掌握IBM-PC系列機的
    發表于 09-28 23:26 ?2749次閱讀
    <b class='flag-5'>軟</b><b class='flag-5'>中斷</b>程序設計

    什么是CDMA的"切換"?

    什么是CDMA的"切換"? 在CDMA系統中還有一種切換稱為"切換"。它指發生在同一基站具有相同頻率的不同扇區間的切換。另外,CDMA系統中還
    發表于 06-01 20:27 ?578次閱讀

    什么是CDMA的"切換"

    什么是CDMA的"切換" 在CDMA系統中還有一種切換稱為"切換"。它指發生在同一基站具有相同頻率的不同扇區間的切換。另外,CDMA
    發表于 06-15 09:42 ?732次閱讀

    關于FPGA中的PLL等價于MCU中的中斷指令

    FPGA幾乎都有PLL,而Altera和Xilinx的CPLD,幾乎都沒有PLL。PLL在可編程邏輯器件中的地位非常關鍵,它不僅僅是區分CPLD和FPGA的標準,類似MCU中的中斷指令,決定了
    發表于 09-20 18:15 ?0次下載

    Linux 2.4.x內核中斷機制

    本文從Linux內核幾種中斷機制相互關系和發展沿革入手,分析了這些機制的實現方法,給出了它們的基本用法。 中斷概況
    發表于 11-02 11:01 ?0次下載

    如何制作一個存電路

    在這個項目中,我們將制作一個存電路,通過按一個按鈕來打開和關閉電子設備。該電路稱為存開關。
    的頭像 發表于 08-25 16:32 ?5104次閱讀
    如何制作一個<b class='flag-5'>軟</b><b class='flag-5'>鎖</b>存電路

    自旋和互斥的區別有哪些

    自旋 自旋與互斥很相似,在訪問共享資源之前對自旋進行上鎖,在訪問完成后釋放自旋(解鎖);事實上,從實現方式上來說,互斥
    的頭像 發表于 07-21 11:19 ?9569次閱讀

    中斷與硬中斷介紹

    ? 硬中斷是由外部事件引起的因此具有隨機性和突發性;硬中斷是否可以嵌套的,是否有優先級(由硬件設計體系決定)。 ? 中斷是執行中斷指令產生
    的頭像 發表于 11-07 17:02 ?941次閱讀

    互斥和自旋的區別 自旋臨界區可以被中斷嗎?

    互斥和自旋的區別 自旋臨界區可以被中斷嗎? 互斥和自旋是在多線程編程中常用的
    的頭像 發表于 11-22 17:41 ?910次閱讀

    CPU中斷程序:從硬件看什么是中斷

    CPU響應中斷轉去執行中斷服務程序前,需要把中斷程序的現場信息保存起來,以便執行完中斷服務程序后,接著從被
    發表于 03-26 11:36 ?4244次閱讀
    CPU<b class='flag-5'>中斷</b>程序:從硬件看什么是<b class='flag-5'>中斷</b>?
    主站蜘蛛池模板: 热re99久久精品国产99热 | 精品久久久久久久久久 | 人人爽人人干 | 天天干天天操天天爱 | 4hc44四虎www亚洲| 午夜在线观看视频 | 国产精品天天干 | 成人99国产精品 | 中文字幕一精品亚洲无线一区 | 无限国产资源 | 六月丁香啪啪六月激情 | 夜夜操夜夜 | www.午夜视频 | 欧美午夜色大片在线观看免费 | 性欧美视频videos6一9 | 久久国产乱子伦精品免费午夜 | 女主播扒开内衣让粉丝看个够 | 亚洲福利一区二区三区 | 亚洲人成网站色在线观看 | bt种子天堂 | 色福利网站 | 福利视频一区二区 | 欧美一区二区精品 | 亚洲韩国欧美一区二区三区 | 色香五月| 天天操天天射天天爽 | 欧美三级一区二区三区 | 欧美18性欧美丶黑吊 | 成人精品一区二区三区电影 | 国产福利不卡一区二区三区 | 精品三级在线观看 | 日本经典在线三级视频 | 高清欧美色欧美综合网站 | 狠狠色丁香婷婷综合久久片 | 国产精品高清免费网站 | 国产做a爰片久久毛片 | 国产农村妇女毛片精品久久久 | 免费看黄色片的软件 | 三级黄色片免费观看 | 久久久久国产精品四虎 | 天天天天天操 |