I/O控制方式(全網最細)

寫在前面:我是【程序員寶藏】的寶藏派發員,致力於創作原創乾貨。我熱愛技術、熱愛開源與分享,創作的【計算機基礎面試問題】系列文章和【計算機基礎主幹知識】系列文章廣受好評!後期會創作更多優質原創系列文章!如果您對計算機基礎知識、編程等感興趣,可以關注我,我們一起成長!

本人力薦:如果覺得CSDN排版不夠美觀,歡迎來我的個人原創公zong號【程序員寶藏】(號如其名,誠不欺你!)查看有紅色重點標記和排版美觀的全系列文章(不細你來找我要紅包
參考鏈接TCP三次握手四次揮手

好多同學問我要pdf版,我乾脆把全部文章都整理成了pdf直接打印版,在公zong號後臺回覆關鍵字【寶藏】即可免費帶回家慢慢看


相關係列文章:


正文開始

1.程序直接控制方式

如下圖所示,計算機從外部設備讀取數據到存儲器,每次讀一個字的數據。對讀入的每個字, CPU 需要對外設狀態進行循環檢查,直到確定該字已經在I/0 控制器的數據寄存器中。在程序直接控制方式中,由於CPU 的高速性和I/0設備的低速性,致使CPU 的絕大部分時間都處於等待I/0 設備完成數據I/0 的循環測試中,造成了CPU 資源的極大浪費。在該方式中, CPU 之所以要不斷地測試I/0 設備的狀態,就是因爲在CPU 中未採用中斷機構,使I/0 設備無法向CPU報告它已完成了一個字符的輸入操作。

【痛點】程序直接控制方式雖然簡單且易於實現,但其缺點也顯而易見,由於CPU 和I/0 設備只能串行工作,導致CPU 的利用率相當低。

2.中斷驅動方式

其實後一種的方式都是對前一種的方式的一種改進(OS裏面都是爲了提高資源利用率和併發性等才改進的,其他也差不多),計算機專業的課程很多都可以用這樣的方法學習,不要硬背,這些都不是孤立的,回答的時候體現出改進,一步一步的講出來,條理和邏輯會比較清楚!

中斷驅動方式的思想是,允許I/0 設備主動打斷CPU 的運行並請求服務,從而“解放"CPU,使得其向I/0 控制器發送讀命令後可以繼續做其他有用的工作。如下圖所示,我們從I/0 控制器和CPU 兩個角度分別來看中斷驅動方式的工作過程:

【1】從I/0 控制器的角度來看, I/0 控制器從CPU 接收一個讀命令,然後從外圍設備讀數據。一且數據讀入該I/0 控制器的數據寄存器,便通過控制線給CPU 發出一箇中斷信號,表示數據已準備好,然後等待CPU 請求該數據。I/0 控制器收到CPU 發出的取數據請求後,將數據放到數據總線上,傳到CPU 的寄存器中。至此,本次I/0 操作完成, I/0 控制器又可開始下一次I/0操作。
【2】從CPU 的角度來看, CPU 發出讀命令,然後保存當前運行程序的上下文(現場,包括程序計數器及處理機寄存器),轉去執行其他程序。在每個指令週期的末尾, CPU 檢查中斷。當有來自I/0 控制器的中斷時, CPU 保存當前正在運行程序的上下文,轉去執行中斷處理程序以處理該中斷。這時, CPU 從I/0 控制器讀一個字的數據傳送到寄存器,並存入主存。接着, CPU 恢復發出I/0 命令的程序(或其他程序)的上下文,然後繼續運行。

【痛點】:中斷驅動方式比程序直接控制方式有效,但由於數據中的每個字在存儲器與I/0 控制器之間的傳輸都必須經過CPU, 這就導致了中斷驅動方式仍然會消耗較多的CPU 時間。

【注意】:什麼叫經過CPU呢?
答:在DMA(Direct memory access 直接存儲器訪問)之前,輸入數據流大概是這樣的:
【外圍設備->I/O控制器的數據寄存器->CPU寄存器->存儲器】,這就叫經過CPU,或者說傳輸數據的過程需要CPU的干預,於是引出了所謂的DMA(直接在I/O設備和內存之間建立數據通路)。

3.DMA方式

爲何引入DMA前面提到了,所有改進如下:

  1. 基本單位是數據塊(前面是一個字)。
  2. 所傳送的數據,是從設備直接送入內存的,或者相反。
  3. 僅在傳送一個或多個數據塊的開始和結束時,才需CPU 干預,整塊數據的傳送是在DMA控制器的控制下完成的。

  1. 命令/狀態寄存器(CR) 。用於接收從CPU 發來的I/0 命令或有關控制信息,或設備的狀態。
  2. 內存地址寄存器(MAR) 。在輸入時,它存放把數據從設備傳送到內存的起始目標地址;在輸出時,它存放由內存到設備的內存源地址。
  3. 數據寄存器(DR) 。用於暫存從設備到內存或從內存到設備的數據。
  4. 數據計數器(DC) 。存放本次要傳送的字(節)數。

如下圖所示,DMA方式的工作過程是: CPU 接收到I/O 設備的DMA 請求時,它給I/0
控制器發出一條命令,啓動DMA 控制器,然後繼續其他工作。之後CPU 就把控制操作委託給DMA 控制器,由該控制器負責處理。DMA 控制器直接與存儲器交互,傳送整個數據塊,每次傳送一個字,這個過程不需要CPU 參與。傳送完成後,DMA 控制器發送一箇中斷信號給處理器。因此只有在傳送開始和結束時才需要CPU的參與(預處理【設置CR、MAR、DC等】和後處理【中斷處理、喚醒因該I/O阻塞的進程程等】)。

DMA控制方式與中斷驅動方式的主要區別是:中斷驅動方式在每個數據需要傳輸時中斷
CPU, 而DMA 控制方式則是在所要求傳送的一批數據全部傳送結束時才中斷CPU; 此外,中斷驅動方式數據傳送是在中斷處理時由CPU 控制完成的,而DMA 控制方式則是在DMA 控制器的控制下完成的(前面提到了,加深印象!)。

【不算痛點】:如何進一步提高資源利用率呢?當然是請更牛逼的祕書(通道),老闆(CPU)儘可能的從累活中解放出來。

4.通道控制方式

I/0 通道是指專門負責輸入/輸出的處理機。I/O通道方式是DMA方式的發展,它可以進一步
減少CPU的干預,即把對一個數據塊的讀(或寫)爲單位的干預,減少爲對一組數據塊的讀(或寫)及有關控制和管理爲單位的干預。同時,又可以實現CPU、通道和I/0 設備三者的並行操作,從而更有效地提高整個系統的資源利用率。

例如,當CPU要完成一組相關的讀(或寫)操作及有關控制時,只需向I/O 通道發送一條I/O 指令,以給出其所要執行的通道程序的首地址和要訪問的I/0 設備,通道接到該指令後,執行通道程序便可完成CPU 指定的I/O任務,數據傳送結束時向CPU發中斷請求。(都有預處理和後處理,畢竟CPU纔是老闆!)

I/O通道與一般處理機的區別是:通道指令的類型單一,沒有自己的內存,通道所執行的通道程序是放在主機的內存中的,也就是說通道與CPU 共享內存。

I/O 通道與DMA方式的區別是:DMA 方式需要CPU 來控制傳輸的數據塊大小、傳輸的內存位置,而通道方式中這些信息是由通道控制的。另外,每個DMA 控制器對應一臺設備與內存傳遞數據,而一個通道可以控制多臺設備與內存的數據交換(包工頭;也是上面提到的三者能並行的原因)。

5.總(舉個栗子)

科班的同學應該不用看這個栗子也早就理解了,但爲了照顧跨考的同學(不來個三連嗎?),舉個栗子總結以上4種方式:

想象一位客戶要去裁縫店做一批衣服的情形。
1)採用程序直接控制時,裁縫沒有客戶的聯繫方式,客戶必須每隔一段時間去裁縫店看看裁縫
把衣服做好了沒有,這就浪費了客戶不少的時間。
2)採用中斷驅動方式時,裁縫有客戶的聯繫方式,每當他完成一件衣服後,給客戶打一個電話,讓客戶去拿,與程序直接控制能省去客戶不少麻煩,但每完成一件衣服就讓客戶去拿一次,仍然比較浪費客戶的時間。
3)採用DMA 方式時,客戶花錢僱一位單線祕書,並向祕書交代好把衣服放在哪裏(存放倉庫),裁縫要聯繫就直接聯繫祕書,祕書負責把衣服取回來並放在合適的位置,每處理完100 件衣服,祕書就要給客戶報告一次(大大節省了客戶的時間)。
4)採用通道方式時,祕書擁有更高的自主權,與DMA方式相比,他可以決定把衣服存放在哪裏,而不需要客戶操心。而且,何時向客戶報告,是處理完100 件衣服就報告,還是處理完10000件衣服才報告,祕書是可以決定的。客戶有可能在多個裁縫那裏訂了貨,一位DMA 類的祕書只能負責與一位裁縫溝通,但通道類祕書卻可以與多名裁縫進行溝通。

不要忘記去我的個人原創公zong號【程序員寶藏】----專注於計算機基礎、編程、分享,獲取【寶藏】哦!
在這裏插入圖片描述

作爲過來人,有考研的小夥伴可以加我好友(公zong號有二維碼,備註【考研】),免費解答相關問題,做你的知心大哥哥!我們一研爲定


覺得有收穫?希望老鐵們來個三連擊(點贊、評論、收藏),讓更多的人看到這篇文章!順便也激勵下我,嘿嘿!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章