日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OS- -I/O之I/O软件原理及层次结构

發布時間:2024/4/11 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OS- -I/O之I/O软件原理及层次结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OS- -I/O之I/O軟件原理及層次結構

文章目錄

  • OS- -I/O之I/O軟件原理及層次結構
    • 一、I/O軟件原理
      • 1.I/O軟件目標
        • 設備獨立性
        • 錯誤處理
        • 同步和異步傳輸
        • 緩沖
        • 共享和獨占
      • 2.使用程序控制I/O
      • 3.使用中斷驅動I/O
      • 4.使用DMA的I/O
    • 二、I/O層次結構
      • 1.中斷處理程序
      • 2.設備驅動程序
      • 3.與設備無關的I/O軟件
        • 緩沖
        • 錯誤處理
        • 設備驅動程序統一接口
        • 分配和釋放
        • 設備無關的塊
      • 4.用戶空間的I/O軟件

一、I/O軟件原理

1.I/O軟件目標

設備獨立性

  • 現在讓我們轉向對I/O軟件的研究,I/O軟件設計一個很重要的目標就是設備獨立性(device independence)。
  • 啥意思呢?這意味著我們能夠編寫訪問任何設備的應用程序,而不用事先指定特定 的設備。
  • 比如你編寫了一個能夠從設備讀入文件的應用程序,那么這個應用程序可以從硬盤、DVD或者USB進行讀入,不必再為每個設備定制應用程序。
  • 這其實就體現了設備獨立性的概念。

再比如說你可以輸入一條下面的指令

sort 輸入輸出
  • 那么上面這個 輸入 就可以接收來自任意類型的磁盤或者鍵盤,并且 輸出 可以寫入到任意類型的磁 盤或者屏幕。
  • 計算機操作系統是這些硬件的媒介,因為不同硬件它們的指令序列不同,所以需要操作系統來做指令間 的轉換。
  • 與設備獨立性密切相關的一個指標就是統一命名(uniform naming) ,設備的代號應該是一個整數或 者是字符串,它們不應該依賴于具體的設備。
  • 在UNIX中,所有的磁盤都能夠被集成到文件系統中,所 以用戶不用記住每個設備的具體名稱,直接記住對應的路徑即可,如果路徑記不住,也可以通過Is 等指令找到具體的集成位置。
  • 舉個例子來說,比如一個USB磁盤被掛載到了 /usr/cxuan/backup下,那么你把文件復制到/usr/cxuan/backup/device下,就相當于是把文件復制到了磁盤中,通
    過這種方式,實現了向任何磁盤寫入文件都相當于是向指定的路徑輸出文件。

錯誤處理

  • 除了設備獨立性外,I/O軟件實現的第二個重要的目標就是錯誤處理(error handling)
  • 通常情況 下來說,錯誤應該交給硬件層面去處理。如果設備控制器發現了讀錯誤的話,它會盡可能的去修復這 個錯誤。如果設備控制器處理不了這個問題,那么設備驅動程序應該進行處理
  • 設備驅動程序會再次嘗 試讀取操作,很多錯誤都是偶然性的,如果設備驅動程序無法處理這個錯誤,才會把錯誤向上拋到硬件 層面(上層)進行處理,很多時候,上層并不需要知道下層是如何解決錯誤的。
  • 這就很像項目經理不用 把每個決定都告訴老板;程序員不用把每行代碼如何寫告訴項目經理。這種處理方式不夠透明。

同步和異步傳輸

  • I/O軟件實現的第三個目標就是同步(synchronous)和異步(asynchronous),即中斷驅動)傳輸。
  • 這里先說一下同步和異步是怎么回事吧。
  • 同步傳輸中數據通常以塊或幀的形式發送。
  • 發送方和接收方在數據傳輸之前應該具有同步時鐘。
  • 而在異步傳輸中,數據通常以字節或者字符的形式發送,異步傳輸則不需要同步時鐘,但是會在傳輸之前向 數據添加奇偶校驗位。

下面是同步和異步的主要區別:

  • 大部分物理IO(physical I/O)是異步的。物理I/O中的CPU是很聰明的,CPU傳輸完成后會轉而做其他事情,它和中斷心靈相通,等到中斷發生后,CPU才會回到傳輸這件事情上來。
  • I/O分為兩種:物理I/O和 邏輯I/O(Logical I/O)
  • 物理I/O通常是從磁盤等存儲設備實際獲取數據。邏輯I/O是對存儲器(塊,緩沖區)獲取數 據。

緩沖

  • I/O軟件的最后一個問題是緩沖(buffering)。
  • 通常情況下,從一個設備發出的數據不會直接到達最 后的設備。其間會經過一系列的校驗、檢查、緩沖等操作才能到達。
  • 舉個例子來說,從網絡上發送一個 數據包,會經過一系列檢查之后首先到達緩沖區,從而消除緩沖區填滿速率和緩沖區過載。

共享和獨占

  • I/O軟件引起的最后一個問題就是共享設備和獨占設備的問題。
  • 有些I/O設備能夠被許多用戶共同使 用。一些設備比如磁盤,讓多個用戶使用一般不會產生什么問題,但是某些設備必須具有獨占性,即只 允許單個用戶使用完成后才能讓其他用戶使用。
  • 下面,我們來探討一下如何使用程序來控制I/O設備。一共有三種控制I/O設備的方法
  • ?使用程序控制I/O
  • ?使用中斷驅動I/O
  • ?使用DMA驅動I/O

2.使用程序控制I/O

  • 使用程序控制I/O又被稱為 可編程I/O ,它是指由CPU在驅動程序軟件控制下啟動的數據傳輸,來訪問設備上的寄存器或者其他存儲器。
  • CPU會發出命令,然后等待I/O操作的完成。由于CPU的速度 比I/O模塊的速度快很多,因此可編程I/O的問題在于,CPU必須等待很長時間才能等到處理結果。
  • CPU在等待時會采用輪詢(polling)或者 忙等(busy waiting)的方式,結果,整個系統的性能 被嚴重拉低。可編程I/O十分簡單,如果需要等待的時間非常短的話,可編程I/O倒是一個很好的方 式。
  • 一個可編程的I/O會經歷如下操作
  • ?CPU請求I/O操作
  • ?I/O模塊執行響應
  • ?I/O模塊設置狀態位
  • ?CPU會定期檢查狀態位
  • ?I/O不會直接通知CPU操作完成
  • ?I/O也不會中斷CPU
  • ?CPU可能會等待或在隨后的過程中返回

3.使用中斷驅動I/O

  • 鑒于上面可編程I/O的缺陷,我們提出一種改良方案,我們想要在CPU等待I/O設備的同時,能夠做其他事情,等到I/O設備完成后,它就會產生一個中斷,這個中斷會停止當前進程并保存當前的狀態。

一個可能的示意圖如下:

  • 盡管中斷減輕了 CPU和I/O設備的等待時間的負擔,但是由于還需要在CPU和I/O模塊之前進行大量的逐字傳輸,因此在大量數據傳輸中效率仍然很低。
  • 下面是中斷的基本操作
  • ?CPU進行讀取操作
  • ?I/O設備從外圍設備獲取數據,同時CPU執行其他操作
  • ?I/O設備中斷通知CPU
  • ?CPU請求數據
  • ?I/O模塊傳輸數據

所以我們現在著手需要解決的就是CPU和I/O模塊間數據傳輸的效率問題。

4.使用DMA的I/O

  • DMA的中文名稱是直接內存訪問,它意味著CPU授予I/O模塊權限在不涉及CPU的情況下讀取或寫入內存。也就是DMA可以不需要CPU的參與。這個過程由稱為DMA控制器(DMAC)的芯片管 理。
  • 由于DMA設備可以直接在內存之間傳輸數據,而不是使用CPU作為中介,因此可以緩解總線上 的擁塞。DMA通過允許CPU執行任務,同時DMA系統通過系統和內存總線傳輸數據來提高系統并發 性。

二、I/O層次結構

  • I/O軟件通常組織成四個層次,它們的大致結構如下圖所示
  • 每一層和其上下層都有明確的功能和接口。下面我們采用和計算機網絡相反的套路,即自下而上的了解 一下這些程序。
  • 下面是另一幅圖,這幅圖顯示了輸入/輸出軟件系統所有層及其主要功能

1.中斷處理程序

  • 在計算機系統中,中斷就像女人的脾氣一樣無時無刻都在產生,中斷的出現往往是讓人很不爽的。
  • 中斷 處理程序又被稱為中斷服務程序或者是ISR(Interrupt Service Routines),它是最靠近硬件的 一層。中斷處理程序由硬件中斷、軟件中斷或者是軟件異常啟動產生的中斷,用于實現設備驅動程序或 受保護的操作模式(例如系統調用)之間的轉換。
  • 中斷處理程序負責處理中斷發生時的所有操作,操作完成后阻塞,然后啟動中斷驅動程序來解決阻塞。
  • 通常會有三種通知方式,依賴于不同的具體實現:
  • ?信號量實現中:在信號量上使用up進行通知;
  • ?管程實現:對管程中的條件變量執行signal操作
  • ?還有一些情況是發送一些消息

不管哪種方式都是為了讓阻塞的中斷處理程序恢復運行。

  • 中斷處理方案有很多種,下面是一些方案:
  • ?非嵌套的中斷處理程序按照順序處理各個中斷,非嵌套的中斷處理程序也是最簡單的中斷處理
  • ?嵌套的中斷處理程序會處理多個中斷而無需分配優先級
  • ?可重入的中斷處理程序可使用優先級處理多個中斷
  • ?簡單優先級中斷處理程序可處理簡單的中斷
  • ?標準優先級中斷處理程序比低優先級的中斷處理程序在更短的時間能夠處理優先級更高的中斷
  • ?高優先級中斷處理程序在短時間能夠處理優先級更高的任務,并直接進入特定的服務例程。
  • ?優先級分組中斷處理程序能夠處理不同優先級的中斷任務
  • 下面是一些通用的中斷處理程序的步驟,不同的操作系統實現細節不一樣
  • ?保存所有沒有被中斷硬件保存的寄存器
  • ?為中斷服務程序設置上下文環境,可能包括設置TLB、MMU和頁表
  • ?為中斷服務程序設置棧
  • ?對中斷控制器作出響應,如果不存在集中的中斷控制器,則繼續響應中斷
  • ?把寄存器從保存它的地方拷貝到進程表中
  • ?運行中斷服務程序,它會從發出中斷的設備控制器的寄存器中提取信息
  • ?操作系統會選擇一個合適的進程來運行。如果中斷造成了一些優先級更高的進程變為就緒態,則選 擇運行這些優先級高的進程
  • ?為進程設置MMU±下文,可能也會需要TLB,根據實際情況決定
  • ?加載進程的寄存器,包括PSW寄存器
  • ?開始運行新的進程

上面我們羅列了一些大致的中斷步驟,不同性質的操作系統和中斷處理程序能夠處理的中斷步驟和細節也不盡相同,下面是一個嵌套中斷的具體運行步驟:

2.設備驅動程序

  • 在上面我們知道了設備控制器所做的工作。我們知道每個控制器其內部都會有寄存器用來和設 備進行溝通,發送指令,讀取設備的狀態等。
  • 因此,每個連接到計算機的I/O設備都需要有某些特定設備的代碼對其進行控制,例如鼠標控制器需要 從鼠標接受指令,告訴下一步應該移動到哪里,鍵盤控制器需要知道哪個按鍵被按下等。這些提供I/O 設備到設備控制器轉換的過程的代碼稱為 設備驅動程序(Device driver)
  • 為了能夠訪問設備的硬件,實際上也就意味著,設備驅動程序通常是操作系統內核的一部分,至少現在 的體系結構是這樣的。
  • 但是也可以構造用戶空間的設備驅動程序,通過系統調用來完成讀寫操作。這 樣就避免了一個問題,有問題的驅動程序會干擾內核,從而造成崩潰。
  • 所以,在用戶控件實現設備驅動 程序是構造系統穩定性一個非常有用的措施。MINIX 3就是這么做的。

下面是MINI 3的調用過程:

  • 然而,大多數桌面操作系統要求驅動程序必須運行在內核中。操作系統通常會將驅動程序歸為字符設備和塊設備
  • 塊設備是一個能存儲固定大小塊信息的設備,它支持以固定大小的塊,扇區或群集讀取和(可選)寫入數據。
  • 每個塊都有自己的物理地址。
  • 通常塊的大小在512 - 65536之間。
  • 所有傳輸的信息都會以連續的塊為單位。塊設備的基本特征是每個塊都較為對立,能夠獨立的進行讀寫。
  • 常見的塊設備有硬盤、藍光光盤、USB盤
  • 另一類I/O設備是字符設備。
  • 字符設備以字符為單位發送或接收一個字符流,而不考慮任何塊結構。
  • 字符設備是不可尋址的,也沒有任何尋道操作。
  • 常見的字符設備有打印機、網絡設備、鼠標、以及大多數與磁盤不同的設備。
  • 在UNIX系統中,操作系統是一個二進制程序,包含需要編譯到其內部的所有驅動程序,如果你要對 UNIX添加一個新設備,需要重新編譯內核,將新的驅動程序裝到二進制程序中。
  • 然而隨著大多數個人計算機的出現,由于I/O設備的廣泛應用,上面這種靜態編譯的方式不再有效,因 此,從MS-DOS開始,操作系統轉向驅動程序在執行期間動態的裝載到系統中。
  • 設備驅動程序具有很多功能,比如接受讀寫請求,對設備進行初始化、管理電源和日志、對輸入參數進 行有效性檢查等。
  • 設備驅動程序接受到讀寫請求后,會檢查當前設備是否在使用,如果設備在使用,請求被排入隊列中, 等待后續的處理。如果此時設備是空閑的,驅動程序會檢查硬件以了解請求是否能夠被處理。
  • 在傳輸開 始前,會啟動設備或者馬達。等待設備就緒完成,再進行實際的控制。控制設備就是對設備發出指令。
  • 發出命令后,設備控制器便開始將它們寫入控制器的設備寄存器。在將每個命令寫入控制器后,會檢 查控制器是否接受了這條命令并準備接受下一個命令。
  • 一般控制設備會發出一系列的指令,這稱為指令 序列,設備控制器會依次檢查每個命令是否被接受,下一條指令是否能夠被接收,直到所有的序列發出 為止
  • 發出指令后,一般會有兩種可能出現的情況。在大多數情況下,設備驅動程序會進行等待直到控制器完 成它的事情。
  • 這里需要了解一下設備控制器的概念
  • 設備控制器的主要主責是控制一個或多個I/O設備,以實現I/O設備和計算機之間的數據交換。
  • 設備控制器接收從CPU發送過來的指令,繼而達到控制硬件的目的
  • 設備控制器是一個可編址的設備,當它僅控制一個設備時,它只有一個唯一的設備地址;
    如果設備控制器控制多個可連接設備時,則應含有多個設備地址,并使每一個設備地址對應一個設備。
  • 設備控制器主要分為兩種:字符設備和塊設備
  • 設備控制器的主要功能有下面這些:
  • ?接收和識別命令:設備控制器可以接受來自CPU的指令,并進行識別。設備控制器內部也會有寄存器,用來存放指令和參數
  • ?進行數據交換:CPU.控制器和設備之間會進行數據的交換,CPU通過總線把指令發送給控制器,或從控制器中并行地讀出數據;控制器將數據寫入指定設備。
  • ?地址識別:每個硬件設備都有自己的地址,設備控制器能夠識別這些不同的地址,來達到控制硬件的目的,此外,為使CPU能向寄存器中寫入或者讀取數據,這些寄存器都應具有唯一的地址。
  • ?差錯檢測:設備控制器還具有對設備傳遞過來的數據進行檢測的功能。
  • 在這種情況下,設備控制器會阻塞,直到中斷來解除阻塞狀態。
  • 還有一種情況是操作是可以無延遲的完 成,所以驅動程序不需要阻塞。在第一種情況下,操作系統可能被中斷喚醒;第二種情況下操作系統不 會被休眠。
  • 設備驅動程序必須是可重入的,因為設備驅動程序會阻塞和喚醒然后再次阻塞。驅動程序不允許進行 系統調用,但是它們通常需要與內核的其余部分進行交互。

3.與設備無關的I/O軟件

  • I/O軟件有兩種,一種是我們上面介紹過的基于特定設備的,還有一種是設備無關性的,設備無關性也 就是不需要特定的設備。
  • 設備驅動程序與設備無關的軟件之間的界限取決于具體的系統。

下面顯示的功 能由設備無關的軟件實現:

  • 與設備無關的軟件的基本功能是對所有設備執行公共的I/O功能,并且向用戶層軟件提供一個統一的接 口。

緩沖

無論是對于塊設備還是字符設備來說,緩沖都是一個非常重要的考量標準。

  • 下面是從ADSL(調制解調 器)讀取數據的過程,調制解調器是我們用來聯網的設備。
  • 用戶程序調用read系統調用阻塞用戶進程,等待字符的到來,這是對到來的字符進行處理的一種方 式。每一個到來的字符都會造成中斷
  • 中斷服務程序會給用戶進程提供字符,并解除阻塞。將字符提 供給用戶程序后,進程會去讀取其他字符并繼續阻塞,這種模型如下:
  • 這一種方案是沒有緩沖區的存在,因為用戶進程如果讀不到數據會阻塞,直到讀到數據為止,這種情況 效率比較低,而且阻塞式的方式,會直接阻止用戶進程做其他事情,這對用戶來說是不能接受的。
  • 還有 一種情況就是每次用戶進程都會重啟,對于每個字符的到來都會重啟用戶進程,這種效率會嚴重降低, 所以無緩沖區的軟件不是一個很好的設計。
  • 作為一個改良點,我們可以嘗試在用戶空間中使用一個能讀取n個字節緩沖區來讀取n個字符。這樣 的話,中斷服務程序會把字符放到緩沖區中直到緩沖區變滿為止,然后再去喚醒用戶進程。 這種方案要 比上面的方案改良很多。
  • 但是這種方案也存在問題,當字符到來時,如果緩沖區被調出內存會出現什么問題?
  • 解決方案是把緩沖 區鎖定在內存中,但是這種方案也會出現問題,如果少量的緩沖區被鎖定還好,如果大量的緩沖區被鎖 定在內存中,那么可以換進換出的頁面就會收縮,造成系統性能的下降。
  • 一種解決方案是在內核中內部創建一塊緩沖區,讓中斷服務程序將字符放在內核內部的緩沖區中。
  • 當內核中的緩沖區要滿的時候,會將用戶空間中的頁面調入內存,然后將內核空間的緩沖區復制到用戶 空間的緩沖區中
  • 這種方案也面臨一個問題就是假如用戶空間的頁面被換入內存,此時內核空間的緩沖 區已滿,這時候仍有新的字符到來,這個時候會怎么辦?因為緩沖區滿了,沒有空間來存儲新的字符 了。
  • 一種非常簡單的方式就是再設置一個緩沖區就行了,在第一個緩沖區填滿后,在緩沖區清空前,使用第 二個緩沖區

這種解決方式如下:

  • 當第二個緩沖區也滿了的時候,它也會把數據復制到用戶空間中,然后第一個緩沖區用于接受新的字 符。這種具有兩個緩沖區的設計被稱為雙緩沖(double buffering)。
  • 還有一種緩沖形式是 循環緩沖(circular buffer) ,它由一個內存區域和兩個指針組成。一個指針 指向下一個空閑字,新的數據可以放在此處。另外一個指針指向緩沖區中尚未刪除數據的第一個字。
  • 在 許多情況下,硬件會在添加新的數據時,移動第一個指針;而操作系統會在刪除和處理無用數據時會移 動第二個指針。兩個指針到達頂部時就回到底部重新開始。
  • 緩沖區對輸出來說也很重要。對輸出的描述和輸入相似緩沖技術應用廣泛,但它也有缺點。如果數據被緩沖次數太多,會影響性能。

考慮例如如下這種情況:

  • 數據經過用戶進程-> 內核空間-> 網絡控制器,這里的網絡控制器應該就相當于是socket緩沖區,然 后發送到網絡上,再到接收方的網絡控制器-> 接收方的內核緩沖-> 接收方的用戶緩沖,一條數據包被 緩存了太多次,很容易降低性能。

錯誤處理

  • 在I/O中,出錯是一種再正常不過的情況了。當出錯發生時,操作系統必須盡可能處理這些錯誤。有一 些錯誤是只有特定的設備才能處理,有一些是由框架進行處理,這些錯誤和特定的設備無關。
  • I/O錯誤的一類是程序員編程錯誤,比如還沒有打開文件前就讀流,或者不關閉流導致內存溢出等 等。這類問題由程序員處理;
  • 另外一類是實際的I/O錯誤,例如向一個磁盤壞塊寫入數據,無論怎么寫 都寫入不了。這類問題由驅動程序處理,驅動程序處理不了交給硬件處理,這個我們上面也說過。

設備驅動程序統一接口

  • 我們在操作系統概述中說到,操作系統一個非常重要的功能就是屏蔽了硬件和軟件的差異性,為硬件和 軟件提供了統一的標準,這個標準還體現在為設備驅動程序提供統一的接口,因為不同的硬件和廠商編 寫的設備驅動程序不同,所以如果為每個驅動程序都單獨提供接口的話,這樣沒法搞,所以必須統一。

分配和釋放

  • 一些設備例如打印機,它只能由一個進程來使用,這就需要操作系統根據實際情況判斷是否能夠對設備 的請求進行檢查,判斷是否能夠接受其他請求,一種比較簡單直接的方式是在特殊文件上執行open 操作。
  • 如果設備不可用,那么直接open會導致失敗。還有一種方式是不直接導致失敗,而是讓其阻 塞,等到另外一個進程釋放資源后,在進行open打開操作。
  • 這種方式就把選擇權交給了用戶,由用戶 判斷是否應該等待。

注意:阻塞的實現有多種方式,有阻塞隊列等

設備無關的塊

  • 不同的磁盤會具有不同的扇區大小,但是軟件不會關心扇區大小,只管存儲就是了。一些字符設備可以 —次一個字節的交付數據,而其他的設備則以較大的單位交付數據,這些差異也可以隱藏起來。

4.用戶空間的I/O軟件

  • 雖然大部分I/O軟件都在內核結構中,但是還有一些在用戶空間實現的I/O軟件,凡事沒有絕對。一些 I/O軟件和庫過程在用戶空間存在,然后以提供系統調用的方式實現。

總結

以上是生活随笔為你收集整理的OS- -I/O之I/O软件原理及层次结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。