電腦上有個硬體裝置叫做中斷控制器,而CPU上若干個引腳,中斷控制器的輸出引腳會和CPU的輸入引腳連結起來,如果發生中斷,對應引腳會收到訊號。CPU在執行完一個指令後就會去檢查引腳上是否有訊號來,如果有就去處理訊號(也就是中斷函式)。中斷函式是提前準備好的(系統啟動時),cpu收到訊號就去執行。這些流程都是硬體完成的,我們只需要遵循規則就可以了。
所以在收到訊號和訊號處理函式執行之間,是CPU硬體在進行銜接處理。
有人可能會疑惑CPU每次執行完指令都去檢測引腳訊號會不會導致效能問題?實際上不會,這些都是硬體電路完成的,這個檢測邏輯處理速度基本就是電訊號傳遞速度,而目前CPU已經很小了,電訊號那點傳播距離所耗費的時間基本可以忽略。
----------下面是以前的回答-------
簡單說下我的理解。
從CPU的角度看,它的工作就是一直讀取指令,然後執行。如果沒有意外,這個過程會一直持續下去。
程式是由指令序列組成的,CPU執行某個程式時,就是讀取對應程式的指令並執行(不太嚴謹)。如果沒有意外,這個過程就不會中斷,直到所有的指令都執行完。
linux是分時作業系統,就是CPU時間會分為多個時間片,比如10毫秒一個時間片,程式執行一個時間片之後,作業系統會重新選擇一個任務來執行。問題是CPU是怎麼知道時間片到了呢?又是如何觸發任務選擇的呢?
關鍵原理就是CPU有個外部時鐘,這是一個倒數計時器,初始時會設定一個數字,比如1000,然後每個時鐘脈衝數字減一,減到0的時候,就給CPU發一個訊號,CPU會中斷當前程式,來處理這個訊號,這個訊號的處理程式會重置計時器,並執行訊號處理函式,如此反覆,起到了時間分片的效果。
訊號處理函式可能會重新選擇另一個任務來執行,這個就是程序切換。
當然這些都需要CPU在硬體層級進行支援,比如可以接受外部中斷訊號,暫停當前任務,轉去執行訊號處理函式。然後作業系統會利用這種底層機制,做出分時功能。
注:實際中,能打斷當前程式的中斷事件有很多種,包括硬中斷和軟中斷兩大類,可以到網上找到相關的資料研究研究
電腦上有個硬體裝置叫做中斷控制器,而CPU上若干個引腳,中斷控制器的輸出引腳會和CPU的輸入引腳連結起來,如果發生中斷,對應引腳會收到訊號。CPU在執行完一個指令後就會去檢查引腳上是否有訊號來,如果有就去處理訊號(也就是中斷函式)。中斷函式是提前準備好的(系統啟動時),cpu收到訊號就去執行。這些流程都是硬體完成的,我們只需要遵循規則就可以了。
所以在收到訊號和訊號處理函式執行之間,是CPU硬體在進行銜接處理。
有人可能會疑惑CPU每次執行完指令都去檢測引腳訊號會不會導致效能問題?實際上不會,這些都是硬體電路完成的,這個檢測邏輯處理速度基本就是電訊號傳遞速度,而目前CPU已經很小了,電訊號那點傳播距離所耗費的時間基本可以忽略。
----------下面是以前的回答-------
簡單說下我的理解。
從CPU的角度看,它的工作就是一直讀取指令,然後執行。如果沒有意外,這個過程會一直持續下去。
程式是由指令序列組成的,CPU執行某個程式時,就是讀取對應程式的指令並執行(不太嚴謹)。如果沒有意外,這個過程就不會中斷,直到所有的指令都執行完。
linux是分時作業系統,就是CPU時間會分為多個時間片,比如10毫秒一個時間片,程式執行一個時間片之後,作業系統會重新選擇一個任務來執行。問題是CPU是怎麼知道時間片到了呢?又是如何觸發任務選擇的呢?
關鍵原理就是CPU有個外部時鐘,這是一個倒數計時器,初始時會設定一個數字,比如1000,然後每個時鐘脈衝數字減一,減到0的時候,就給CPU發一個訊號,CPU會中斷當前程式,來處理這個訊號,這個訊號的處理程式會重置計時器,並執行訊號處理函式,如此反覆,起到了時間分片的效果。
訊號處理函式可能會重新選擇另一個任務來執行,這個就是程序切換。
當然這些都需要CPU在硬體層級進行支援,比如可以接受外部中斷訊號,暫停當前任務,轉去執行訊號處理函式。然後作業系統會利用這種底層機制,做出分時功能。
注:實際中,能打斷當前程式的中斷事件有很多種,包括硬中斷和軟中斷兩大類,可以到網上找到相關的資料研究研究