在操作系統中,陷阱,中斷和異常是常見的術語,它們貫穿操作系統學習的始終,這篇文章主要區分它們之間的不同。
陷阱
計算機有兩種運行模式:用戶態, 內核態。 其中操作系統運行在內核態,在內核態中,操作系統具有對所有硬件的完全訪問權限,可以使機器運行任何指令;相反,用戶程序運行在用戶態,在用戶態下,軟件只能使用少數指令,它們並不具備直接訪問硬件的權限。這就出現了問題,假如軟件需要訪問硬件或者需要調用內核中的函數該怎么辦呢,這就是陷阱的作用了。陷阱指令可以使執行流程從用戶態陷入內核(這也就是為什么叫做陷阱,而不是捕獵的陷阱)並把控制權轉移給操作系統,使得用戶程序可以調用內核函數和使用硬件從而獲得操作系統所提供的服務,比如用視頻軟件放一個電影,視頻軟件就發出陷阱使用顯示器和聲卡從而訪問硬件。
操作系統有很多系統調用接口供用程序調用。陷阱的發生時間是固定的,比如第一次用視頻軟件時,在加載視頻時軟件會向操作系統發送陷阱指令,第二次播放時,軟件仍然會在同樣的時刻發送陷阱指令。這一點是和中斷的明顯的差別之一。下面介紹中斷。
中斷
中斷是由外部事件導致並且它發生的時間是不可預測的,這一點和陷阱不同。外部事件主要是指時鍾中斷,硬件中斷等。由於CPU一次只能運行一條指令,所以在一個時刻只能有一個程序運行,但我們感覺在我們的計算機中明明可以同時運行很多程序啊,這是由於CPU在多個進程之間快速切換所導致的偽並行。如果某一個程序運行了足夠長用完了分配給它的時間片,CPU決定切換到另一個進程運行,就會產生一個時鍾中斷,切換到下一個進程運行。
硬件中斷顧名思義就是由硬件引起的中斷,比如一個程序需要用戶輸入一個數據,但用戶一直沒有輸入,操作系統決定是一直等待用戶輸入還是轉而運行別的進程,一般情況是轉而運行別的進程,如果用戶的輸入到來了,那么鍵盤驅動器會產生一個中斷通知操作系統,操作系統保存正在運行的程序的狀態,從而切換到原來的進程處理到來的數據。
所以中斷發生是隨機的且主要作用是完成進程間切換,從而支持CPU和設備之間的並行。
中斷和異常的另一個重要差別是,CPU處理中斷的過程中會屏蔽中斷,不接受新的中斷直到此次中斷處理結束。而陷阱的發生並不屏蔽中斷,可以接受新的中斷。
異常
異常就是程序執行過程中的異常行為。比如除零異常,緩沖區溢出異常等。不同的操作系統定義了不同種類和數量的異常並且每個異常都有一個唯一的異常號,異常會擾亂程序的正常執行流程,所以異常是在CPU執行指令時本身出現的問題,比如除數為零而出現的除零異常。異常的產生表示程序設計不合理,所以在編程的時候要盡量避免異常的產生。