2017-09-15 105 views
0

想象一下,我們有一臺計算機除了等待來自網絡的數據並且在接收到數據時對其進行計算之外什麼都不做。計算機如何理解它可以切換到等待網絡數據的進程?

現在我認爲除了 定期檢查一些處理器寄存器,指示數據已準備就緒,然後進行計算,我認爲沒有其他的方式來做到這一點。在我的理解之下,網卡接收到數據後,把它放到內存中,並自己寫入到CPU可以執行計算的cpu寄存器中。在下一個 定期檢查處理器將計算的東西。你能否詳細解釋實際發生的事情(在硬件和操作系統上)。這個問題讓我擔心了很久!

也很高興看到有關它的任何材料!

+0

中斷或輪詢,有太多易於訪問的文檔來列出任何特別的。這個話題太廣泛了,而且信息很容易獲得。 –

+0

另請參見[Wikipedia:Polling](https://en.wikipedia.org/wiki/Polling_(computer_science))和[Wikipedia:Interrupt](https://en.wikipedia.org/wiki/Interrupt) – xmojmr

回答

6

在處理器問題中描述的方法週期性地檢查一些數據寄存器被使用,它被稱爲輪詢。輪詢通常用於更簡單的系統中,因爲它實現起來很簡單,但它有浪費CPU週期來檢查可能存在或不存在的數據的缺點。

實際上,儘管大多數現代操作系統都會使用稱爲的中斷與OS調度程序一起使用的CPU硬件功能。在從網絡獲取數據的例子中,程序將使用一些阻塞讀取呼叫,這將等待從網絡接收數據。一旦進行讀取調用,調用程序將完全停止執行,操作系統的調度程序將使程序保持暫停狀態,直到收到數據。

通常情況下,程序發信號表示希望停止執行,直到發生某種事情(如接收到數據包)爲止,這種方式使用稱爲信號量(或類似的互斥機制)的軟件構造。但是,在網絡代碼的情況下,程序員不能直接訪問信號量。

當網卡接收到數據包時,網卡將數據包存儲到某處的RAM中。一旦完成,網卡會觸發CPU的中斷。中斷(通常)會導致CPU停止執行當前正在運行的任何程序,並且CPU執行與處理網絡活動相關的內核代碼。在這種情況下,它會將收到的數據包發送到正在等待接收數據的程序。

最後,內核使用信號量來表示數據包已收到。內核然後讓調度程序「喚醒」正在等待網絡數據的程序。程序可以處理數據,然後等待來自網絡的下一組數據。

如果您想了解更多信息,我建議您閱讀關於中斷,調度和信號量的操作。這些技術雖然不僅僅用於聯網。使用類似的方法訪問許多其他IO設備。

相關問題