在操作系統中,中斷(Interrupt) 是 CPU 響應外部事件的重要機制,分為 硬中斷(Hardware Interrupt) 和 軟中斷(Software Interrupt)。它們的核心區別在于 觸發方式 和 處理機制。
1. 硬中斷(Hardware Interrupt)
定義
由 硬件設備(如鍵盤、網卡、磁盤)觸發,通知 CPU 有緊急事件需要處理。
特點
- 觸發方式:硬件設備通過 中斷控制器(如 8259A、APIC) 向 CPU 發送電信號。
- 實時性:必須 立即響應,否則可能丟失數據(如網卡數據包)。
- 處理流程:
- 硬件設備觸發中斷。
- CPU 保存當前上下文(寄存器狀態)。
- 跳轉到 中斷處理程序(ISR, Interrupt Service Routine)。
- 執行 ISR(通常分為 上半部(Top Half) 和 下半部(Bottom Half))。
- 恢復上下文,繼續原任務。
示例
- 鍵盤輸入:按下按鍵時觸發硬中斷。
- 網卡收包:數據到達時觸發硬中斷。
2. 軟中斷(Software Interrupt)
定義
由 軟件主動觸發(如系統調用、異常處理),用于請求內核服務或處理異常。
特點
- 觸發方式:通過 指令(如
int 0x80
、syscall
)或 異常(如除零、缺頁)。 - 非實時性:可以延遲處理(如內核的
ksoftirqd
線程)。 - 處理流程:
- 軟件執行中斷指令(如
int 0x80
)。 - CPU 切換到內核態,執行對應的 中斷處理程序。
- 處理完成后返回用戶態。
- 軟件執行中斷指令(如
示例
- 系統調用:如
read()
、write()
通過軟中斷進入內核。 - 異常處理:如除零錯誤、缺頁異常。
- 內核延遲任務:如網絡協議棧的
NET_RX_SOFTIRQ
。
3. 核心區別
特性 | 硬中斷 | 軟中斷 |
---|---|---|
觸發源 | 硬件設備(如鍵盤、網卡) | 軟件(如系統調用、異常) |
實時性 | 必須立即響應 | 可以延遲處理(如 ksoftirqd ) |
上下文切換 | 需要保存硬件上下文 | 僅需保存軟件上下文 |
處理優先級 | 最高(搶占 CPU) | 較低(由內核調度) |
典型應用 | 設備 I/O(如磁盤、網卡) | 系統調用、內核任務 |
4. 硬中斷的上半部 & 下半部
由于硬中斷必須快速響應,Linux 將其分為兩部分:
- 上半部(Top Half):
- 在 中斷禁用 環境下執行。
- 只做 最緊急 的工作(如讀取網卡數據到緩沖區)。
- 完成后 觸發軟中斷 處理剩余任務。
- 下半部(Bottom Half):
- 通過 軟中斷、Tasklet 或 工作隊列 實現。
- 處理 耗時任務(如協議棧解析、磁盤 I/O 完成)。
示例(網卡收包):
- 網卡觸發硬中斷 → 上半部 快速拷貝數據到內存。
- 上半部觸發
NET_RX_SOFTIRQ
→ 下半部 處理數據包。
5. 軟中斷的實現(Linux)
Linux 用 softirq
機制處理延遲任務:
- 預定義軟中斷類型:
enum {HI_SOFTIRQ=0, // 高優先級 TaskletTIMER_SOFTIRQ, // 定時器NET_TX_SOFTIRQ, // 網絡發送NET_RX_SOFTIRQ, // 網絡接收BLOCK_SOFTIRQ, // 塊設備IRQ_POLL_SOFTIRQ, // IRQ 輪詢SCHED_SOFTIRQ, // 進程調度HRTIMER_SOFTIRQ, // 高精度定時器RCU_SOFTIRQ, // RCU 鎖NR_SOFTIRQS // 軟中斷總數 };
- 觸發方式:
raise_softirq(NET_RX_SOFTIRQ); // 觸發網絡收包軟中斷
- 處理線程:
- 內核線程
ksoftirqd/0
、ksoftirqd/1
… 負責執行軟中斷。
- 內核線程
6. 總結
- 硬中斷:硬件觸發,必須立即處理(如設備 I/O)。
- 軟中斷:軟件觸發,可延遲處理(如系統調用、內核任務)。
- 實際應用:
- 網卡收包:硬中斷(上半部) + 軟中斷(下半部)。
- 系統調用:軟中斷(如
int 0x80
)。 - 定時器:軟中斷(
TIMER_SOFTIRQ
)。
理解二者的區別,有助于優化 系統性能 和 實時性要求 高的程序! 🚀