1. 程式人生 > >spin_lock_irqsave關中斷後,為什麼要再禁止搶佔呢,不多餘嗎?

spin_lock_irqsave關中斷後,為什麼要再禁止搶佔呢,不多餘嗎?

轉:

所以,你最開始的疑問:“關中斷只是遮蔽了中斷,並沒有阻止任務切換,高優先順序的任務任然可以搶佔CPU並訪問臨界區和共享變數啊”

關了中斷,就禁止了搶佔,如果當前任務也沒有進行主動排程,當然系統中也就不會出現比當前優先順序更高的任務進入就緒了,也就談不上去“搶佔CPU並訪問臨界區和共享變數”了。(作者這裡說加了條件“如果當前任務也沒有進行主動排程”,那如果當前任務進行了主動排程會怎麼樣?我認為,若是在臨界區中進行了主動排程,那麼後果就是提問的人說的:“關中斷只是遮蔽了中斷,並沒有阻止任務切換,高優先順序的任務任然可以搶佔CPU並訪問臨界區和共享變數”。by imjacob)
由以下網址為證:
http://www.gdjy.com.cn/xuexi/UNIX-XIUGAI/ch02/os0203.htm
 中2.3.4為證。
上面是這麼說的:

關 中 斷 之 後, 任 何 外 部 事 件 都 不 能 打 擾 處 理 機 連 續 執 行 臨 界 區 程 序。 如 果 臨 界 區 程 序 本 身 並 不 包 含 使 它 的 進 程 轉 變 為 封 鎖 狀 態 的 因 素, 那 麼 這 種 方 法 就 能 保 證 臨 界 區 作 為 一 個 整 體 執 行。 這 種 方 法 的 優 點 是 簡 單、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 幹 不 足 之 處。

(1) 它 不 能 用 於 多 處 理 機 系 統。 其 原 因 是: 由 於 該 系 統 中 的 多 個 處 理 機 都 有 其 各 自 的 中 斷 開 關, 因 此 一 個 處 理 機 並 不 能 阻 止 在 其 它 處 理 機 上 運 行 的 進 程 進 入 同 類 臨 界 區。

(2) 在 臨 界 區 中 如 果 包 含 有 使 執 行 它 的 進 程 有 可 能 進 入 封 鎖 狀 態 的 因 素, 則 也 不 能 使 用 這 種 方 法。 因 為 在 該 進 程 進 入 封 鎖 狀 態 後, 系 統 將 調 度 另 一 進 程 使 用 處 理 機, 如 果 需 要, 該 進 程 也 可 以 執 行 臨 界 區 程 序, 不 會 受 到 任 何 阻 攔, 所 以 在 這 種 情 況 下, 開、 關 中 斷 不 能 實 施 臨 界 區 互 斥。

(3) 如 果 臨 界 區 比 較 長, 則 本 法 會 降 低 中 斷 響 應 速 度。

(4) 這 是 一 把 鎖 處 理 各 類 臨 界 區, 不 必 要 地 擴 大 了 互 斥 範 圍。