匯編程序設計與計算機體系結構:軟件工程師教程》 —2.3 處理器">《匯編程序設計與計算機體系結構:軟件工程師教程》 —2.3 處理器
891
2025-03-31
2.4 輸入與輸出
目前為止,我們已經討論了處理器中的某些細節,并且知道了它是怎樣與主板中的其他主要部件相通信的。然而還有一個問題是處理器如何與外部設備進行通信。鍵盤、顯示器、網卡等外部設備需要通過 I/O 模塊(Input/Output Module)與電腦相連,而這些 I/O 模塊同時也與系統總線相連,使得外部設備能夠與計算機中的其他組件(例如 CPU)通信。除了在處理器與外部設備之間提供緩沖通信(buffered communication)機制之外,I/O 模塊還可以完成其他一些重要的操作,例如傳輸數據、對命令進行解碼,以及查詢設備狀態等。
處理器需要用控制器來精準地安排指令的執行工作,使指令之間不會互相干擾。與之類似,I/O 模塊也必須設法在計算機內部的組件與連接到該模塊的外部設備之間協調使雙方能夠有效溝通。前面說過,離 CPU 越遠的設備速度越慢,由于外部設備正是計算機環境中離 CPU 最遠的設備,因此它們的速度是最慢的。由于速度不同,I/O 模塊必須提供數據緩沖區,使 CPU 的工作速度不會因為外部設備而受到影響,同時也令外部設備不會為 CPU 發來的大量數據所淹沒。而且不同的外部設備其速度也有所區別(例如用刻錄機刻錄光盤的速度就與往優盤上復制數據不同),因此每個 I/O 模塊都需要考慮與之相連的設備具有怎樣的數據傳輸率,并據此做出調整。
學習指南:錯誤檢測與修正算法有很多種,例如校驗和、循環冗余校驗(Cyclic Redundancy Check,CRC)、漢明碼(Hamming Code)以及奇偶校驗位(parity bit)等,你可以在網上搜索相關的資料并深入研究。
I/O 模塊的另一項關鍵工作是檢測錯誤,也就是確保外部設備所接收到的數據與發送方所發送的數據是一致的。檢測錯誤的辦法有很多種,但目標都一樣,就是確保數據準確無誤。
處理器執行 I/O 操作通常可以采用 4 種方式:程序 I/O(Programmed I/O,PIO)、中斷驅動 I/O(Interrupt-driven I/O)、直接內存訪問(Direct Memory Access,DMA)以及 I/O 通道(I/O Channel)。在這 4 種方式中,程序 I/O 實現起來最簡單,然而開銷也最大,因此它是效率最低的方案,如圖 2-13 所示。處理器在以 PIO 模式執行 I/O 操作時,首先需要向相關的 I/O 模塊下達命令并等待回應。I/O 模塊負責執行該命令并在執行完畢時把 I/O 狀態寄存器中的相關二進制位設置好,以便告知處理器這條命令已經執行完了。處理器會定期檢查 I/O 狀態寄存器,看 I/O 模塊有沒有把這項操作執行完。這種定期查詢的做法開銷很大,在執行耗時較長的 I/O 操作時更是如此,因為處理器必須多次查詢才能知道這項操作有沒有執行完。
圖 2-13 程序 I/O
如果處理器向 I/O 模塊發送完命令之后不在那里干等著該命令執行完而是去執行其他操作,那么效率可能會高一些。這就是中斷驅動 I/O 所采用的理念,如圖 2-14 所示。處理器向 I/O 模塊下達完命令之后就去執行別的指令了,只有當 I/O 模塊發出中斷請求時,它才會回過頭來繼續處理這項操作。中斷會使處理器暫停其他的操作,先把早前未處理完的這項 I/O 操作執行完。由于處理器在每個指令周期的末尾都要檢測中斷,因此I/O 模塊在發出請求中斷的消息之后,最多只需等待 1 個完整的指令周期就可以令相關的事務得到 CPU 的處理。I/O 模塊在執行命令時幾乎用不著處理器來干預,只是每次把數據寫入主存,或是從主存中讀取數據的時候需要與處理器相配合。
圖 2-14 中斷驅動 I/O
程序 I/O 與中斷驅動 I/O 這兩種處理方式均要求處理器必須全程參與,但由于很多 I/O 操作僅僅是在外部設備與 RAM 之間單純地傳輸數據,因此這會令處理器把許多時鐘周期都浪費在這種簡單的任務上。為了避免浪費,我們可以采用圖 2-15 所描述的這種方式來處理 I/O,這就是直接內存訪問(Direct Memory Access,DMA)。該模式要求主板上必須有專門用來執行 DMA 操作的模塊。當處理器需要執行 I/O 操作時并不把信息直接發送到設備的 I/O 模塊,而是發給剛才說的這個 DMA 模塊。此模塊會在某種程度上模仿 CPU 的處理方式,它每次令 CPU 暫停一個周期從而獲得 I/O 操作的控制權,以便不受限制地訪問系統總線(這種行為叫作周期挪用,cycle stealing)。DMA 模塊執行完 I/O 操作之后,向處理器發送中斷請求以便通知后者。處理器只需把 I/O 操作中不涉及數據傳輸的那部分指令執行完即可,這樣可以節省很多時鐘周期,令計算機得到更為有效的利用。
圖 2-15 直接內存訪問
DMA 模塊看上去似乎解決了 CPU 必須花很多時間處理 I/O 操作這一問題,但實際上它并不是個完整的處理器,因此,必須挪用 CPU 的周期才能完成 DMA 任務。由此可見,與理想狀況相比,CPU 還是會做一些工作。為了把周期挪用問題也解決掉,我們可以拿真正的處理器配置一個專門用來處理 I/O 操作的模塊。這種技術叫作 I/O 通道,它使得該模塊無須再挪用 CPU 的周期來執行任務。此技術有很多種形式,其中一種是每次只處理一臺設備的 I/O操作,還有一種是同時處理很多臺設備的 I/O 操作(這也稱作 multiplex)。有了 I/O 通道,CPU 就不用處理那么多指令了。它只需要把最開始的那條指令告訴該通道,此后就由這個通道來接管并控制 I/O 模塊,令其按照剩下的指令去完成 I/O 操作,而無須再占用 CPU 的周期。
軟件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。