Linux 2.5.4 引入核心搶佔,標誌著 Linux 從傳統協作式核心邁向可搶佔核心,為即時系統、多媒體低延遲應用奠基。本文系統梳理使用者/核心搶佔差異、非搶佔核心特點、搶佔必要性、不可搶佔區域、preempt_count 計數器機制與搶佔觸發時機。
| 類型 | 觸發時機 | 檢查點 |
|---|---|---|
| 使用者搶佔 | 核心即將返回使用者空間 | 系統調用返回、中斷返回 |
| 核心搶佔 | 核心執行期間任意安全點 | 中斷返回核心態、解鎖、啟用軟中斷、顯式 schedule()、阻塞 |
使用者搶佔檢查 need_resched 標誌;核心搶佔額外要求 preempt_count == 0。
核心搶佔雖可在「任意安全點」發生,但以下五種情況必須禁止搶佔:
| 場景 | 原因 |
|---|---|
| 硬體中斷處理 | 中斷上下文不可排程,schedule() 會報錯 |
| 軟中斷 / Bottom Half | 仍在中斷上下文 |
| 持有 spinlock / rwlock | 搶佔會導致其他 CPU 長期空轉等鎖(死等) |
| 排程器本身執行 | 避免排程器被排程器搶佔(無限遞迴) |
| 操作 Per-CPU 資料 | 搶佔後可能遷移至他 CPU,Per-CPU 變數錯位 |
task_struct->preempt_count。preempt_count++(可重入,嵌套遞增)。preempt_count--,歸零時檢查 need_resched,若置位則呼叫 schedule()。preempt_disable()/preempt_enable()、spin_lock()/spin_unlock() 內部自動增減。need_resched && preempt_count==0 → schedule()。spin_unlock()、local_bh_enable() 遞減計數器歸零時檢查觸發。schedule():代碼明確知道可安全搶佔。schedule()。核心搶佔以 preempt_count 為守門員,精準劃定「可搶佔」與「不可搶佔」邊界。理解五大禁區與計數器增減邏輯,是編寫高效核心模組、診斷延遲抖動、移植 PREEMPT_RT 的基石。
解決 locale: Cannot set LC_CTYPE to default locale 錯誤
修改 SSH 預設埠口 22 兩大安全策略:直接修改 vs 雙埠過渡法
Linux 網絡運維核心命令大全:ifconfig、ip、ping、netstat、telnet、ftp 實戰指南
Linux apropos 指令:以關鍵字搜尋 man page 的利器
從 Linux 命令行訪問 Windows 共享資料夾(smbclient 實戰)
解決 Tomcat 啟動報「Neither JAVA_HOME nor JRE_HOME is defined」環境變數配置