1. 程式人生 > 實用技巧 >OS-輸入輸出系統

OS-輸入輸出系統

第六章 輸入輸出系統

6.1 I/O系統的功能,模型,和介面

基本功能

  • 隱藏物理裝置的細節
  • 與裝置的無關性
  • 提高處理機和I/O裝置的利用率
  • 對I/O裝置進行控制
  • 確保對裝置的正確共享
  • 錯誤處理

層次結構

I/O系統介面

  • 塊裝置介面
    • 塊裝置
    • 隱藏了磁碟的二維結構
    • 將抽象命令對映為低層操作
  • 流裝置介面
    • 字元裝置
    • get和put操作
    • in-control指令
  • 網路通訊介面

6.2 I/O裝置和裝置控制器

I/O裝置

  • 型別
    • 按使用特性分類
      • 儲存裝置,I/O裝置
    • 按傳輸速率分類
      • 高速,中速,低速
  • 裝置與控制器的介面

裝置控制器

  • 基本功能
    • 接收和識別命令
    • 資料交換
    • 標識和報告裝置狀態
    • 地址識別
    • 資料緩衝區
    • 差錯控制
  • 組成
    • 裝置控制器和處理機的介面
    • 裝置控制器和裝置的介面
    • I/O邏輯

記憶體映像I/O

對I/O裝置的控制可用以下兩種方法

  • 利用特定的I/O指令
    • cpu-reg:CPU的某個暫存器
    • dev-no:控制器地址
    • dev-reg:指定控制器中的暫存器
    • 缺點:訪問記憶體和訪問裝置用兩種不同指令
  • 記憶體映像I/O
    • 優點:統一了對記憶體和對控制器的訪問方法

I/O通道

  • 目的:建立獨立的I/O操作,使原來由CPU處理的I/O任務轉由通道承擔

  • I/O通道是特殊的處理機,指令型別單一,沒有自己的記憶體,與CPU共享記憶體

  • 通道型別

    • 位元組多路通道

      • 每個子通道完成一個位元組的交換後把主通道讓給下個子通道

    • 陣列選擇通道

    • 陣列多路通道

  • 瓶頸問題

    • 價格昂貴導致通道數量少,通道不足導致瓶頸問題

      • 如想要啟動裝置4,需要通道1和控制器2,但如果通道1被佔用則無法啟動

    • 解決辦法:增加裝置到主機的通路而不增加通道

6.3 中斷機構和中斷處理程式

中斷

  • 中斷分類
    • 中斷
      • 中斷是指CPU對I/O裝置發來的中斷訊號的一種響應
      • CPU暫停正在執行的程式,保留CPU環境後,自動轉去執行I/O裝置的中斷處理程式
      • 執行完再回到斷點,繼續執行程式
    • 陷入
      • 由CPU內部事件所引起的中斷,這類中斷稱為內中斷或陷入
      • 如運算上下溢,程式出錯,電源故障
  • 中斷向量表
    • 每種裝置配相應中斷處理程式,並把該程式入口地址放在中斷向量表的一個表項中
    • 為每個裝置的中斷請求規定一箇中斷號,對應中斷向量表中的表項
  • 中斷優先順序
  • 對多中斷源的處理方式
    • 遮蔽中斷
      • 處理機在處理中斷時,遮蔽所有其他中斷,讓它們等待
    • 巢狀中斷
      • 優先響應最高優先順序的中斷請求
      • 高優先順序的中斷請求可以搶佔正在執行的低優先順序中斷的處理機

中斷處理程式

處理過程

  • 測定是否由未響應的中斷訊號

  • 保護被中斷程序的CPU環境

  • 轉入相應的裝置處理程式

  • 中斷處理

  • 恢復CPU現場並退出中斷

6.4 裝置驅動程式

概述

主要任務:接收上層軟體發來的抽象I/O要求,轉為具體要求傳送給裝置控制器,啟動裝置區執行,反之將裝置控制器發來的訊號傳送給上層軟體

功能

  • 接收由與裝置無關的軟體發來的命令和引數,並將命令中的抽象要求轉換為與裝置相關的低層操作序列
  • 檢查使用者I/O請求的合法性,瞭解I/O裝置的工作狀態,傳遞引數和設定裝置工作方式
  • 發出I/O命令
  • 及時響應由裝置控制器發來的中斷請求

裝置處理方式

  • 為每一類裝置設定一個程序,專門用於執行這類裝置的I/O操作
  • 在整個系統中設定一個I/O程序,輔助執行系統中各類裝置的I/O操作
  • 只為裝置設定相應的裝置驅動程式

處理過程

  1. 將抽象要求轉換為具體要求

  2. 對服務請求進行校驗

  3. 檢查裝置狀態

  4. 傳遞必要引數

  5. 啟動I/O裝置

對I/O裝置的控制方式

  • 使用輪詢的可程式設計I/O方式
    • 啟動輸入裝置輸入資料時,要同時把昨天暫存器中的忙/閒標誌busy置為1
    • 然後不斷地迴圈測試busy(輪詢)
      • busy=1時,表示輸入及尚未輸完一個字(符),繼續測試
      • busy=0時,表示輸入機已將輸入資料送人控制器的資料暫存器中,於是處理機將資料暫存器中的資料取出,送入記憶體指定單元中,完成了一個字(符)的I/O
    • 再去啟動讀下一個資料
  • 使用中斷的可程式設計I/O方式
  • 直接儲存器訪問方式
    • 上面兩種方式都是以字(節)為單位進行I/O,用於塊裝置極其低效
    • 按儲存器訪問方式的引入
      • 該方式資料傳輸的基本單位是資料塊,即在CPU與I/O裝置之間,每次至少傳送一個數據塊
      • 所傳送資料從裝置之間送入記憶體
      • 僅在傳送一個或多個數據塊的開始和結束時才需要CPU干預
    • DMA控制器的組成
      • 主機,DMA控制器的介面,DMA控制器與塊裝置的介面,I/O控制邏輯
      • 命令/狀態暫存器CR,記憶體地址暫存器MAR,資料暫存器DR,資料計數器DC
  • I/O通道控制方式
    • DMA方式的發展,把對一個數據塊的讀或些為單位的干預,減少為對一組資料塊的讀或寫及相關控制和管理為單位的干預
    • 實現CPU,通道,I/O裝置三者的並行操作
    • 通道程式
      • 通道是通過執行通道程式並於裝置控制器共同實現對I/O裝置的控制的
      • 通道程式是由一系列通道指令所構成的,指令包含以下資訊
        • 操作碼
        • 記憶體地址
        • 計數
        • 通道程式結束位P
          • P=1表示本條指令是通道程式最後一條指令
        • 記錄結束標誌R
          • R=0表示本指令和下條指令所處理的資料同屬於一個記錄
          • R=1表示這是處理某記錄的最後一條指令

6.5 與裝置無關的I/O軟體

為了實現裝置獨立性,必須在裝置驅動程式之上再設定一層軟體,稱為與裝置無關的I/O軟體

基本概念

  • 以物理裝置名使用裝置
    • 早期OS中,程式使用I/O裝置時,用的裝置的物理名稱,導致如果所請求的物理裝置已被分配其他程序,儘管由其他相同裝置空閒可用,但物理名不同,所有不能分配給程式
  • 引入邏輯裝置名
    • 應用程式可用申請分配不同物理名,但邏輯裝置名(型別名)相同的裝置
    • 用於I/O操作的裝置可更換(即重定向),而不必改變應用程式
  • 邏輯裝置名稱到物理裝置名稱的轉換
    • 配置邏輯裝置表進行轉換

與裝置無關的I/O軟體

  • 裝置驅動程式的統一介面
  • 緩衝管理
  • 差錯控制
    • 暫時性錯誤
    • 永續性錯誤
  • 對獨立裝置的分破壞回收
  • 獨立於裝置的邏輯資料塊

裝置分配

  • 裝置分配中的資料結構

  • 考慮因素

    • 裝置固有屬性

      不同裝置分配策略不同

      • 獨佔裝置
      • 共享裝置
      • 虛擬裝置
    • 裝置分配演算法

      • 先來先服務
      • 優先順序高者優先
    • 裝置分配中的安全性

      • 安全分配方式
        • 一旦程序以獲得某裝置後便阻塞,直到I/O操作完成才被喚醒
      • 不安全分配方式
  • 獨佔裝置的分配程式

    • 基本的裝置分配程式

    • 依次進行分配裝置,控制器,通道

邏輯裝置表(Logical Unit Table,LUT)

  1. 整個系統設定一張LUT,用於單使用者系統
  2. 每個使用者設定一張LUT

6.6 使用者層的I/O軟體

假離線系統SPOOLing

假離線技術

  • 為了緩和CPU的高速性和I/O裝置低速性之間的矛盾,引入了離線輸入,輸出技術。
  • 用一道程式模擬離線輸入時外圍控制機的功能,把低速I/O裝置上的資料傳送到高速磁碟上
  • 再用另一道程式模擬離線輸出時外圍控制機的功能,把資料從磁碟傳送到低速輸出裝置上
  • 實質是將獨佔裝置轉化為共享裝置的技術。
  • 這種聯機情況下實現的同時外圍操作技術稱為SPOOLing技術,或稱為假離線技術

SPOOLing組成

  • 輸入井和輸出井:在磁碟上開闢出來的,用於模擬離線輸入,輸出時的磁碟
  • 輸入緩衝區和輸出緩衝區:在記憶體中開闢出來的,用於緩和CPU和磁碟之間速度不匹配的矛盾
  • 輸入程序和輸出程序,用於模擬離線輸入/輸出時的外圍控制機
  • 井管理程式:用於控制作用和磁碟井之間資訊的交換

特點

  • 提高了I/O速度
  • 將獨佔裝置改造為共享裝置
  • 實現了虛擬裝置功能

假離線印表機系統

  • 每當使用者程序發出列印輸出請求時
    • 在磁碟緩衝區中為之申請一個空閒盤塊,將要列印的資料送入其中暫存
    • 為使用者程序申請一張空白使用者請求打印表,並把列印要求填入,將表掛在假離線檔案佇列上
  • 真正列印輸出由假離線列印程序負責
    • 從假離線檔案佇列隊首取出一張使用者請求打印表,將資料由輸出井傳送到記憶體緩衝區,再交付印表機列印

守護程序

  • 允許使用印表機的唯一程序
  • 若有列印請求,喚醒,否則睡眠
  • 還有很多其他的守護程序,如網路守護程序

6.7 緩衝區管理

緩衝的引入原因

  • 緩衝CPU與I/O裝置間速度不匹配的矛盾
  • 減少對CPU的中斷頻率,放寬對CPU中斷響應時間的限制
  • 解決資料粒度不匹配的問題
  • 提高CPU與I/O裝置之間的並行性

緩衝區分類

把使用者程序稱為生產者,產生輸出;系統為消費者,提取資料輸出。如果生產者已經生產,消費者還未準備好結束,則生產者必須暫停等待,若設定了緩衝區,則無需等待就緒,資料可以先輸出到緩衝區

單緩衝區

  • 磁碟把資料輸入到緩衝區時間T,OS把緩衝區資料傳送到使用者區時間M,CPU對資料出來時間C,T和C可並行
  • 若使用者程序已有第二行資料輸出時,第一行資料尚未提取完畢,則程序應被阻塞

雙緩衝區

  • 若緩衝區資料仍未被取走,生產者還是得等待,所以引入了雙緩衝取機制,又稱為緩衝對換
  • 雙緩衝區還能讓兩臺機器連線時雙向資料傳輸

環形緩衝區

組成
  • 多個緩衝區
    • 裝輸入資料的空緩衝區R
    • 已裝滿資料的緩衝區G
    • 計算程序正在使用的現行工作緩衝區C
  • 多個指標
    • 指示計算程序下個可用緩衝區G的指標Nextg,
    • 計算程序正在使用的緩衝區C的指標Current
    • 指示輸入程序下次可用的空緩衝區指標Nexti
使用
  • Getbuf過程
  • Releasebuf過程
程序間的同步問題

使用輸入迴圈緩衝,可讓輸入程序和計算程序並行執行,相應的指標Nexti和Nextg不斷沿著順時針方向移動,可能出現

  • Nexti指標追趕上Nextg指標
    • 意味著輸入程序輸入資料速度大於計算程序處理資料速度,已把全部可用空緩衝區裝滿,此時輸入程序應該被阻塞
  • Nextg指標追趕上Nexti指標
    • 意味著輸入程序輸入資料速度小於計算程序處理資料速度,全部裝有輸入資料的緩衝區都被抽空,此時計算程序應該被阻塞

緩衝池Buffer Pool

緩衝池與緩衝區的區別在於:緩衝區僅僅是一組記憶體塊的連結串列,快取池是包含一個管理的資料結構及一組操作函式的管理機制,用於管理多個緩衝區

組成
  • 空白緩衝佇列emq
  • 輸入佇列inq
  • 輸出佇列outq

還有四種工作緩衝區:收容輸入資料/輸出資料的工作緩衝區,用於提前輸入/輸出資料的工作緩衝區

工作方式

為使程序都能互斥的訪問緩衝池佇列,為每個佇列設定了一個互斥訊號量MS(type),為了程序都能同步的使用緩衝區,又為每個緩衝佇列設定了一個資源訊號量RS(type)

void Getbuf(unsigned type)
{
	Wait(RS(type));
	Wait(MS(type));
	B(number)=Takebuf(type);
	Signal(MS(type));
}

void Putbuf(type,number)
{
	Wait(MS(type));
	Addbuf(type,number);
	Signal(MS(type));
	Signal(RS(type));
}

6.8 磁碟儲存器的效能和排程

磁碟效能簡述

磁碟型別

  • 軟盤和硬碟
  • 單片盤和多片盤
  • 固定頭磁碟和移動頭磁碟
    • 固定:每條磁軌都有讀寫磁頭
    • 移動:每個盤面僅有一個磁頭,為訪問盤面上的所有磁軌,磁頭必須移動進行尋道,本節主要針對該磁碟

磁碟訪問時間

  • 尋道時間Ts:磁頭移動道指定磁軌所經歷時間
    • 啟動時間s,移動n條磁軌,每條m時間
    • Ts=m x n+s
  • 旋轉延遲時間Tr
  • 傳輸時間Tt

磁碟排程演算法

以下圖例子程序請求訪問磁碟先後次序按FCFS為準!

先來先服務FCFS

  • 按程序請求訪問磁碟的先後次序進行排程

最短尋道時間優先SSTF

  • 要求訪問的磁軌與當前磁頭所在磁軌距離最近,使每次尋道時間最短

基於掃描的磁碟排程演算法

  • 掃描SCAN演算法/電梯演算法

    • 基於優先順序的排程演算法
    • 不僅考慮與當前磁軌的距離,更優先考慮磁頭當前的移動方式
  • 迴圈掃描CSCAN演算法

    • 將最小磁軌號緊接最大磁軌號構成迴圈,進行迴圈掃描

  • NStepSCAN和FSCAN排程演算法

    • NStepSCAN
      • 將磁碟請求佇列分成若干個長度為N的子佇列,按FCFS演算法依次處理,每處理一個佇列時又是按SCAN演算法,避免出現粘著現象
      • 粘著現象即是磁臂停留在某處不動的情況
    • FSCAN
      • 將磁碟請求佇列分成兩個子佇列
        • 由當前所有請求磁碟I/O的程序形成的
        • 在掃描期間新出現的所有請求磁碟I/O的程序放入等待處理的請求佇列