色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內(nèi)不再提示

哪些關閉了Linux搶占?搶占又關閉了誰?

Linux閱碼場 ? 來源:未知 ? 作者:胡薇 ? 2018-05-04 08:57 ? 次閱讀

本文對比分析:

preempt_disable()

local_irq_disable()/local_irq_save(flags)

spin_lock()

spin_lock_irq()/spin_lock_irqsave(lock, flags)

哪些關閉了搶占?另外,再說清楚,搶占又關閉了誰。

首先,把這幾個API的關系圖再勾勒一下。

我們理解,spin_lock()會調(diào)用preempt_disable() 導致本核的搶占調(diào)度被關閉(preempt_disable函數(shù)實際增加preempt_count來達到此效果),其次我們理解spin_lock_irq()是local_irq_disable()+preempt_disable()的合體。

下面一幅圖描述了幾個函數(shù)之間的包含關系如下:

local_irq_disable()/local_irq_save()的disable和save版的唯一區(qū)別是,要不要保存CPU對中斷的屏蔽狀態(tài)。

spin_lock_irq()/spin_lock_irqsave(lock, flags)的唯一區(qū)別是,要不要保存CPU對中斷的屏蔽狀態(tài)。

是誰殺了搶占?

Kernel的代碼明確顯示,執(zhí)行搶占調(diào)度的時候,會同時檢測“non-zero preempt_count or interrupts are disabled”:

我們可以進一步展開preemptible():

對于ARM處理器而言,判斷irqs_disabled(),其實就是判斷CPSR中的IRQMASK_I_BIT是否被設置。

所以,我們得出一個結(jié)論,前言這一節(jié)里面,列出的所有函數(shù),都能關閉本核的搶占調(diào)度。因為,無論是preempt_count計數(shù)狀態(tài),還是中斷被關閉,都會導致kernel認為無法搶占!

通殺邏輯如下:

殺手的差異在哪里?

既然都關閉了搶占,那么區(qū)別在哪里呢?

我們看兩段代碼,假設下面的代碼都發(fā)生在NICE為0的普通進程:

preempt_disable()

xxx(1)

preempt_enable()

local_irq_disable()

xxx(2)

local_irq_enable()

首先,xxx(1)和xxx(2)里面,都是不可以搶占的。一個搞定了preempt_count,一個搞定了中斷。

但是假設xxx(1)內(nèi)喚醒了一個高優(yōu)先級的RT任務,那么在preempt_enable()的時刻,直接就是一個搶占點,這個時候,發(fā)生schedule,高優(yōu)先級RT任務進來跑;假設xxx(2)內(nèi)喚醒了一個高優(yōu)先級的RT任務,那么在local_irq_enable()的時刻,不是一個搶占點,高優(yōu)先級RT的任務必須等待下一個搶占點。下一個搶占點,可能是時鐘tick處理返回、中斷返回、軟中斷結(jié)束、yield()等等多種情況。

在preempt_enable()中,會執(zhí)行一次preempt_schedule():

而local_irq_enable()只是單純的開啟CPU對中斷的響應,對于ARM而言,它就是:

再來看大boss,spin_lock_irq是同時調(diào)用了preempt_disable和local_irq_disable:

而對應的spin_unlock_irq()則同時調(diào)用了local_irq_enable()和preempt_enable():

大家想一想,為何preempt_enable()比local_irq_enable()后發(fā)生呢?如果代碼順序是這樣的:

preempt_enable()

local_irq_enable()

第一句preempt_enable()想執(zhí)行搶占調(diào)度的話,即便調(diào)用了preempt_schedule(),但是由于IRQ還是關門的,preempt_schedule()函數(shù)會立即返回(詳見《是誰殺了搶占?》一節(jié)),所以無法搶占;后一句local_irq_enable()不會執(zhí)行搶占調(diào)度。所以,如果這么干的話,

spin_lock_irq()

xxx(3)

spin_unlock_irq()

如果xxx(3)喚醒了高優(yōu)先級的RT,在spin_unlock_irq()的時刻,將無法直接搶占!

還好,真正的順序是:

local_irq_enable()

preempt_enable()

所以,在spin_unlock_irq()的時刻,RT進程就換入執(zhí)行了。

看小一點的boss,spin_lock():

spin_lock()

xxx(4)

spin_unlock()

如果xxx(4)喚醒了RT進程,在spin_unlock()的時刻,會立即搶入。因為spin_unlock()會調(diào)用preempt_enable()。

而搶占又殺了誰?

理論上,關搶占,并沒有徹底的關閉調(diào)度器,因為進程還是可以主動地sleep:

上述代碼,在spin_lock的區(qū)間里面,調(diào)用了msleep(),這個時候,不屬于搶占,Linux還是會pick下一個task來跑。

不過這樣的代碼,一般在后期蘊藏著巨大的風險,導致后期的莫名崩潰。所以呢,實際的工程里面,我們是嚴格地禁止的。

建議大家打開Kernel里面的config里面的DEBUG_ATOMIC_SLEEP,一旦出現(xiàn)這種情況,讓kernel去匯報錯誤。

這種情況下,kernel檢測到有人在atomic上下文里面執(zhí)行可能睡眠的行為,會直接報執(zhí)行的棧回溯。

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

    關注

    68

    文章

    10873

    瀏覽量

    212058
  • Linux
    +關注

    關注

    87

    文章

    11313

    瀏覽量

    209755
  • API
    API
    +關注

    關注

    2

    文章

    1502

    瀏覽量

    62124

原文標題:宋寶華: 是誰關閉了Linux搶占,而搶占又關閉了誰?

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

收藏 人收藏

    評論

    相關推薦

    gd32vf103根據(jù)例子配置systick和adc中斷,但是adc中斷無法搶占systick是為什么?

    根據(jù)例子配置systick和adc中斷,但是adc中斷無法搶占systick 配置為向量和非相量都沒有實現(xiàn)
    發(fā)表于 01-10 07:43

    MPLS LSP隧道搶占

    MPLS LSP隧道搶占
    發(fā)表于 05-30 15:26

    Linux內(nèi)核搶占和用戶搶占的概念和區(qū)別

    本文詳解了Linux內(nèi)核搶占實現(xiàn)機制。首先介紹內(nèi)核搶占和用戶搶占的概念和區(qū)別,接著分析不可
    發(fā)表于 08-05 08:18

    詳解Linux內(nèi)核搶占實現(xiàn)機制

    本文詳解了Linux內(nèi)核搶占實現(xiàn)機制。首先介紹內(nèi)核搶占和用戶搶占的概念和區(qū)別,接著分析不可
    發(fā)表于 08-06 06:16

    嵌入式Linux實時化技術詳談

    Linux內(nèi)核設計中,中斷可以搶占最高優(yōu)先級的任務,使高優(yōu)先級任務被阻塞的最長時間不確定。而且,由于內(nèi)核為保護臨界區(qū)需要關閉中斷,更加增長了高優(yōu)先級任務阻塞時間。  ● 時鐘精度  Linux
    發(fā)表于 08-03 07:00

    蘋果更新,教你關閉iPhone手機系統(tǒng)更新

    近期,蘋果更新10.2的系統(tǒng),對部分粉絲來說是好事兒,但是有很多蘋果手機用戶并不想更新系統(tǒng),但是總是會有一個煩人的小紅點提醒。那么,如何關閉蘋果手機的系統(tǒng)更新呢?
    發(fā)表于 12-19 14:22 ?3.9w次閱讀

    谷歌針對位置記錄問題更新 可以徹底關閉

    。 對此谷歌近日針對這一問題進行了更新,更新內(nèi)容顯示,如果位置記錄項目被關閉,那么位置信息就不再會得到保存
    的頭像 發(fā)表于 08-25 10:04 ?4288次閱讀

    Linux開放端口和關閉端口的方法

    Linux開放端口和關閉端口的方法如下
    發(fā)表于 05-18 09:14 ?1w次閱讀
    <b class='flag-5'>Linux</b>開放端口和<b class='flag-5'>關閉</b>端口的方法

    linux的端口怎么關閉

    怎么關閉linux的端口?下面本篇文章給大家介紹一下linux下查看端口是否打開、關閉/打開端口的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
    發(fā)表于 05-29 09:27 ?4079次閱讀
    <b class='flag-5'>linux</b>的端口怎么<b class='flag-5'>關閉</b>

    Linux閱碼場原創(chuàng)精華文章分享,你值得擁有

    技術的前世今生之前世 郭健:Linux進程調(diào)度技術的前世今生之今生 宋寶華:是關閉Linux搶占
    的頭像 發(fā)表于 10-10 16:28 ?2754次閱讀

    Linux中內(nèi)核搶占相關的基礎知識

    今天要分享的是搶占相關的基礎知識。本文以內(nèi)核搶占為引子,概述一下 Linux 搶占的圖景。我盡量避開細節(jié)問題和源碼分析。 什么是內(nèi)核搶占
    的頭像 發(fā)表于 11-09 16:48 ?2050次閱讀

    關閉Linux搶占

    我們理解,spin_lock()會調(diào)用preempt_disable() 導致本核的搶占調(diào)度被關閉(preempt_disable函數(shù)實際增加preempt_count來達到此效果),其次我們理解spin_lock_irq()是local_irq_disable()+pr
    發(fā)表于 08-07 17:19 ?892次閱讀
    是<b class='flag-5'>誰</b><b class='flag-5'>關閉</b><b class='flag-5'>了</b><b class='flag-5'>Linux</b><b class='flag-5'>搶占</b>?

    Linux下如何開啟、關閉端口

    查看防火墻狀態(tài) 在Linux控制臺輸入:firewall-cmd --state 此時控制臺返回:not running表示防火墻處于關閉狀態(tài)
    的頭像 發(fā)表于 05-12 14:54 ?5655次閱讀
    <b class='flag-5'>Linux</b>下如何開啟、<b class='flag-5'>關閉</b>端口

    操作系統(tǒng)中搶占式和非搶占式內(nèi)核的區(qū)別

    操作系統(tǒng)一般分為搶占式內(nèi)核和非搶占式內(nèi)核,通常RTOS都是搶占式內(nèi)核。你知道搶占式內(nèi)核和非搶占式內(nèi)核的區(qū)別嗎?
    的頭像 發(fā)表于 05-29 10:47 ?1950次閱讀
    操作系統(tǒng)中<b class='flag-5'>搶占</b>式和非<b class='flag-5'>搶占</b>式內(nèi)核的區(qū)別

    linux關閉docker的命令

    Linux 系統(tǒng)中,關閉 Docker 的操作可以通過以下多種方式進行。本文將詳細講解每一種方式,并提供示例代碼和命令,以幫助讀者更好地理解和實踐。 使用 docker 命令 最常用的方法
    的頭像 發(fā)表于 11-23 09:39 ?2868次閱讀
    主站蜘蛛池模板: 伊人AV一区二区三区夜色撩人| 无码日韩人妻精品久久蜜桃入口| 国产AV一区二区三区日韩| 接吻吃胸摸下面啪啪教程| 俄罗斯人xxx| 亚洲中文字幕无码一去台湾| 午夜噜噜噜私人影院在线播放| 精品免费久久久久久影院| babesvideos欧美最新| 中文在线观看| 天美传媒在线观看完整高清| 日韩高清在线亚洲专区| 欧美激情一区二区三区四区| 男女牲交全过程免费播放| 狠狠久久免费视频在线| 国产精品人妻无码免费A片导航| 丹麦1o一19sex性hdhd| 成人人猿泰山| 国产AV亚洲精品久久久久| 国产69精品9999XXXX| 国产91专区| 国产乱码精品AAAAAAAA| GAY2022空少被体育生暴菊| A级韩国乱理伦片在线观看| 亚洲欧洲日本天天堂在线观看| 亚色九九九全国免费视频| 亚洲国产欧美日本大妈| 亚洲精品在线看| 深夜释放自己污在线看| 我半夜摸妺妺的奶C了她| 无码专区aaaaaa免费视频| 少妇高潮A片特黄久久精品网| 特黄AAAAAAA片免费视频| 亚洲 综合 欧美在线 热| 亚洲欧美视频在线| 在线涩涩免费观看国产精品| 97精品视频| 中文字幕永久在线| 99久久99久久久精品久久| 耻辱诊察室1一4集动漫在线观看| 国产成人高清精品免费观看|