1. 程式人生 > >作業系統學習筆記:I/O輸入系統

作業系統學習筆記:I/O輸入系統

計算機兩大主要任務:IO操作和計算處理。許多情況下,主要是IO操作,計算處理只是附帶的(而作業系統的兩大任務是管理物理裝置和為應用程式提供一個虛擬機器器的抽象)。作業系統在IO方面的作用是管理IO操作和IO裝置。

一、概述
I/O裝置在功能與速度方面存在很大差異,所以需要採用多種方法來控制裝置。這些方法形成IO子系統的核心,使得作業系統核心其他部分不必涉及複雜的IO裝置管理。

IO裝置技術呈現兩個相矛盾的趨勢:一方面,硬體與軟體介面日益標準化,有助將裝置整合到現有計算機和作業系統,另一方面,IO裝置的多樣性卻又日益增長,甚至有的新舊版本區別很大,以至於很難整合。這種困難需要硬體和軟體一起配合解決。作業系統核心設計成使用裝置驅動程式模組的結構,而驅程為IO子系統提供了統一裝置訪問介面。

二、IO硬體
硬體自帶有所謂控制器。處理器通過控制器來控制硬體。那麼處理器如何向控制器傳送命令和資料?簡單而言,控制器有一些暫存器,處理器就是通過讀寫這些暫存器來與控制器通訊,這又有2種方式,一是通過IO指令;二是通過記憶體對映:裝置控制暫存器被對映到處理器的地址空間,處理器通過標準資料傳輸指令來執行IO請求。

具體來說是醬紫的:
1、輪詢
主機不斷讀取暫存器的狀態,以決定下一步動作。效率較差。

2、中斷
控制器主動發出中斷請求訊號通知CPU。中斷分優先順序,多級中斷。效率高。

3、直接記憶體訪問
對於需要做大量傳輸的裝置,例如磁碟,耗費CPU來觀察暫存器太浪費,通常將任務下方給專用處理器,稱之為直接記憶體訪問(DMA)控制器。CPU向記憶體寫入資料,然後就繼續忙別的,DMA控制器接手進行資料傳輸,完了以後中斷通知CPU。

三、IO應用介面
IO應用介面使得IO裝置可以按統一的標準方式來對待。
具體來說,從不同的IO裝置中抽象出通用型別,每個通用型別都可以通過一組標準函式(即介面)來訪問。具體的差別被核心模組(裝置驅動程式)所封裝。裝置驅動程式層的作用就是為核心IO子系統隱藏裝置控制器之間的差異。
這裡寫圖片描述
不利的因素是每種作業系統都有自己的介面標準,一個裝置可能有多種驅動程式。

對應用程式而言,裝置的許多差別都被作業系統所隱藏,裝置可以分為幾種型別:塊與字元裝置,網路裝置,時鐘與定時器等。

1、塊與字元裝置
比如磁碟,鍵盤,滑鼠、印表機、音效卡等。

2、網路裝置
Socket介面

3、時鐘與定時器
排程程式使用定時器(硬體)產生中斷;作業系統也為使用者程序提供了使用定時器的介面。

4、阻塞與非阻塞I/O
“當應用程式發出一個阻塞系統呼叫時,應用程式的執行被掛起,從作業系統的執行佇列移到等待佇列。在系統呼叫完成後,應用程式就移回執行佇列,並在某個時刻繼續執行並收到系統呼叫返回的值”。IO裝置的執行時間不可預計,但作業系統為應用程式介面使用阻塞呼叫。
就是說,應用程式訪問IO裝置時,作業系統會讓應用程式等待,直至IO裝置返回結果。當然,作業系統不可能也陪著乾等,它是讓應用程式在一旁等候,然後自己繼續為另一些程式服務。就好比到麥當勞點餐,收銀員(作業系統排程程式)在你(應用程式)點完餐後,吩咐後臺(IO裝置)準備食物,然後讓你移到一旁等候(掛起),接著她說:下一位點餐。

這裡寫圖片描述

四、IO核心子系統
核心提供了許多與IO有關的服務,如排程、緩衝、快取記憶體、假離線、裝置預留及錯誤處理等。這些服務建立在硬體和裝置驅動程式之上。IO子系統還負責保護自己免受錯誤程序和惡意使用者的危害。

1、IO排程
就是確定一個合適的順序來執行IO請求。排程能改善效能。
排程可由開發人員實現,也可以由作業系統分配。
IO子系統改善計算機效率的方法之一就是IO排程,另外一種方法是使用記憶體或磁碟上的儲存空間技術,如緩衝、快取記憶體、假離線等。

2、緩衝
緩衝區是用來儲存兩個裝置之間或裝置和應用程式之間所傳輸資料的記憶體區域。
這樣做有三個理由:
1)資料流生產者與消費者之間的速度存在差異
2)協調傳輸資料大小不一致的裝置
3)支援應用程式IO的複製語義。所謂複製語義,就是處理前先對資料進行復制,保證處理過程中不受資料來源發生變化所影響。

3、快取記憶體
快取記憶體是可以保留資料副本的高速儲存器。快取記憶體副本的訪問要比原始資料訪問更高效。快取記憶體與緩衝是兩個不同的功能。

4、假離線與裝置預留
假離線就是一種排隊機制。

5、錯誤處理
作業系統可以預防許多硬體和應用程式的錯誤,這樣就不會因為小的機械失靈導致系統崩潰。

6、IO保護
為了防止使用者執行非法IO,定義所有IO指令為特權指令。使用者不能直接發出IO指令,只能通過作業系統來進行。
另外,所有記憶體對映和IO埠記憶體位置都受到記憶體保護系統的保護,以阻止使用者訪問。但核心不能簡單地拒絕所有使用者訪問, 因為有些軟體需要直接訪問記憶體對映來提高效能,核心採取鎖機制來應對。

7、核心資料結構
核心需要儲存IO元件使用的狀態資訊,可以通過若干核心資料結構如檔案開啟表等來完成。事實上,核心使用許多類似的結構來跟蹤網路連線,字元裝置通訊和其他IO活動等。
作業系統採用面嚮物件的技術,採用統一結構來封裝不同裝置之間的差異。

五、把IO操作轉換成硬體操作

現代作業系統通過對請求與物理裝置控制器之間的多級表查詢,可以獲得巨大的靈活性。應用程式與驅動程式之間的請求傳遞機制是通用的。因此,不必重新編譯核心也能為計算機引入新裝置和新驅動程式。事實上,有的作業系統能夠按需載入裝置驅動程式,系統啟動之時,系統先檢測硬體匯流排以確定有哪些裝置,接著作業系統就馬上或等首次IO請求時裝入所需的驅程。

以下是一個典型的檔案讀請求週期:
1)一個程序對已開啟檔案的檔案描述符呼叫阻塞read()系統呼叫

2)核心系統呼叫程式碼檢查引數是否正確。對於輸入,如果資料已在快取記憶體中,那麼將資料返回程序並完成IO請求

3)否則執行物理 IO請求。此時程序從執行佇列移到裝置的等待佇列,並排程IO請求。最後IO子系統對裝置驅動程式發出請求。根據作業系統的不同,該請求可能通過子程式呼叫或核心訊息傳遞

4)裝置驅動程式分配核心緩衝區空間以接收資料,並排程IO。最後裝置驅動程式通過寫入裝置控制器暫存器來對裝置控制器傳送命令。

5)裝置控制器控制裝置硬體以執行資料傳輸

6)驅動程式可以輪詢檢測狀態和資料,或動過DMA將資料傳入到核心記憶體。假設為DMA,當傳輸完成後產生中斷

7)中斷處理程式通過中斷向量表收到中斷,儲存必要的資料,並向核心裝置驅動程式傳送訊號通知,然後從中斷返回。

8)裝置驅動程式接收到訊號,確定IO請求是否完成,確定請求狀態,並向核心IO子系統傳送訊號,通知請求已完成

9)核心將資料返回程式碼傳遞誒請求程序的地址空間,將程序從等待佇列移到就緒佇列,阻塞解除,程序繼續執行

總結:程序請求 -》核心檢查,返回或物理IO請求 - 向裝置驅動請求 - 裝置驅動程式排程IO - 裝置控制器資料傳輸 - 通知裝置驅動 - 核心 - 程序

六、流
流是裝置驅動程式和使用者級程序之間的全雙工連線。
這裡寫圖片描述

流由流開始 + 若干流模組 + 控制裝置驅動程式結尾 組成。它們都有一對佇列:讀佇列和寫佇列。佇列之間使用訊息傳遞進行資料傳輸。佇列會緩衝訊息,而且沒有足夠緩衝空間就不會接收訊息,是為流控制。

如圖。從流開始,訊息不斷複製一直到驅動程式結尾和裝置。

使用流的好處是流可以提供一個框架,以便以模組化以及遞增的方式編寫裝置驅動程式和網路協議。模組可以為不同的流以及不同的裝置所使用。

七、效能
IO是影響系統性能的重要因素之一。
執行裝置驅動程式程式碼,以及隨之出現的程序阻塞和排程,上下文切換,這些都增加了CPU或者快取記憶體的負擔。雖然現代計算機每秒能處理數千箇中斷,但是中斷處理仍然是相對費時的任務,IO暴露出核心中斷機制的任何效率缺陷。

為了改善IO效率,可以採用一些原則:
1)減少上下文切換
2)減少裝置和應用程式之間傳遞資料時在記憶體之間的資料複製次數
3)通過使用大傳輸,智慧控制器,輪詢,以減少中斷頻率
4)通過採用DMA智慧控制器和通道來為主CPU承擔簡單資料複製,以增加併發
5)將處理原語移入硬體,允許控制器內的操作與CPU和匯流排內的操作併發
6)平衡CPU,記憶體子系統,匯流排和IO的效能