2012-04-30 33 views
4

我對中斷有一個基本的疑問。設想一臺沒有任何中斷的計算機,因此爲了執行I/O操作,CPU必須定期輪詢鍵盤的鍵盤按鍵,鼠標點擊等。現在如果它中斷了,CPU會定期檢查中斷線是否變高(或變低)。那麼如何通過使用中斷來節省CPU週期。根據我的理解,而不是現在檢查設備,我們正在檢查中斷線。有人可以解釋我出錯的基本邏輯。輪詢v/s中斷

*這裏通過輪詢我並不是說CPU處於忙碌的等待狀態。引用維基百科「輪詢也指設備重複檢查準備就緒狀態,如果不是計算機返回不同的任務」

回答

4

@大衛Schwartz和@RKT是正確的,它不會採取任何CPU週期來檢查斷線。

基本上,處理器有一組中斷線連接到一堆設備。當其中一個設備有話要說時,它打開中斷線,觸發處理器(,沒有任何軟件的幫助)暫停執行當前指令並開始運行處理程序功能。

這是它的工作原理。當操作系統啓動時,它會使用一個特殊的指令來註冊一組回調(實際上是一個函數指針表),該指令採用表的第一個條目的地址。當中斷N被觸發時,處理器從表中提取第N個條目,並在其引用的存儲器中的位置運行代碼。該函數內部的代碼由OS作者在彙編中編寫,但通常它所做的只是保存堆棧和寄存器的狀態,以便在調用中斷處理程序後可以恢復當前任務,然後調用更高級別通用中斷處理程序,用C語言編寫,處理「如果這是一個頁面錯誤,執行X」,「如果這是一個鍵盤中斷,執行Y」,「如果這是系統調用,執行Z」等等的邏輯。當然,不同的體系結構和語言也有不同,但其要點是一樣的。

帶有軟件中斷的想法(用Unix的說法是「信號」)是一樣的,除了操作系統爲信號處理程序設置堆棧的工作。基本過程是用戶態進程通過系統調用一次向OS註冊一個信號處理程序,系統調用將處理函數的地址作爲參數,然後在將來的某個時間,操作系統認識到它應該發送該進程信號。下一次該進程運行時,操作系統會將其指令指針設置爲處理程序函數的開頭,並將其所有寄存器保存到進程可以在恢復執行該進程之前將其恢復的某處。通常,處理程序將具有某種路由邏輯,以提醒接收到信號的相關代碼位。當進程完成信號處理程序的執行時,它恢復信號處理程序運行之前存在的寄存器狀態,並在其停止的地方恢復執行。因此,軟件中斷比輪詢更有效地學習從內核到這個過程的事件(然而,由於大多數信號都有特定的用途,所以這不是一個通用的機制)。

3

它不需要任何CPU週期來檢查中斷線。它是由專用硬件完成的,而不是由CPU指令完成的。它被稱爲中斷的原因是因爲如果中斷線有效,CPU將中斷。

+0

嗨,謝謝你的回答,但我有點困惑。 「CPU被中斷」的含義究竟是什麼。 CPU如何知道它不需要檢查而需要中斷服務 – Pratt

+0

用同樣的方法可以知道電話何時響鈴而不檢查它。振鈴中斷你。你的大腦是這樣構造的,當手機響時,無論它在做什麼,它都會被打斷,並且注意到手機正在響鈴。您不必輪詢電話以查看是否正在響鈴。 –

+0

電話鈴響的例子正好描繪了我的困惑。這是不是意味着我的大腦無意識地「投票」了連接到我耳朵的神經元。 – Pratt

1

「CPU中斷」:它將離開(暫停)正常程序執行,然後執行ISR(中斷子程序)並再次返回執行暫停程序。

CPU來了解中斷通過IRQ(中斷請求)和IF(中斷標誌)

-1

中斷:計算機中的設備產生的事件,以引起CPU的注意。 用於提高處理器利用率。 要處理中斷,有一箇中斷服務程序(ISR)與之關聯。 要中斷處理器,器件會在其IRQ線上發送一個信號,並繼續這樣做直到處理器確認中斷。 CPU然後通過將程序狀態字(PSW)和PC推入控制堆棧來執行上下文切換。 CPU執行ISR。 Pooling是計算機等待外部設備檢查其準備情況的過程。 計算機不檢查設備的狀態 輪詢通常用於低級別硬件 示例:當打印機通過Parrnell端口連接時,計算機將等待打印機接收到下一個字符。 這些過程可以像只讀1分鐘一樣。字節

-1

有兩種不同的方法(輪詢&中斷)爲計算機系統的I/O提供服務。在輪詢中,CPU一直處於繁忙狀態,要麼將輸入數據提供給I/O設備,如果是,則檢查相應設備的源端口以及該輸入的優先級以便爲其提供服務。

在中斷驅動的方法中,當數據被提供給I/O設備時,會產生一箇中斷並且CPU檢查該輸入的優先級以便爲其服務。