1. 程式人生 > >現代作業系統: 第五章 輸入/輸出

現代作業系統: 第五章 輸入/輸出

除了提供抽象之外(程序、地址空間和檔案),作業系統還要控制計算機的所有I/O(輸入和輸出)裝置。

5.1 I/O硬體原理

對於電子工程師來言,I/O硬體就是晶片、導線、電源、電機和其他組成硬體的物理部件。對於程式設計師來言,則只注意I/O硬體提供給軟體的介面。

5.1.1 I/O裝置

I/O裝置大致可分為兩類:塊裝置和字元裝置。

  • 塊裝置:塊裝置把資訊儲存在固定大小的塊中,每個塊有自己的地址。,每個塊都獨立於其他塊讀寫。塊可定址裝置與其他裝置之間並沒有嚴格的界限。
  • 字元裝置:字元裝置以字元為單位傳送或接受一個字元流,而不考慮任何塊結構,是不可定址的,也沒有任何尋道操作。

在這裡插入圖片描述

5.1.2 裝置控制器

I/O裝置一般由機械部件和電子部件兩部分組成,電子部件稱為裝置控制器或介面卡,機械部分則是裝置本身。 控制器和裝置之間的介面一般是很低層次的介面。

控制器的任務是將序列的位流轉換為位元組塊,並進行必要的錯誤矯正工作。

5.1.3 記憶體對映I/O

每個控制器有幾個暫存器用來與CPU進行通訊。通過寫入這些暫存器,作業系統可以命令裝置傳送資料、接受資料、開啟或關閉,或者執行某些其他操作。

那麼CPU如何與裝置控制暫存器和資料緩衝區進行通訊:

  1. 每個控制暫存器被分配一個I/O埠號,形成I/O埠空間,只有作業系統可以訪問。
  2. 將所有的暫存器對映到記憶體空間(記憶體對映I/O) 。每個控制暫存器都被分配唯一一個記憶體地址,並且不會有記憶體被分配到這一地址。
  3. 混合實現方案

在這裡插入圖片描述

工作原理:CPU將需要的地址放到匯流排地址線-》在匯流排的一條控制線上設定一個read訊號-》第二條訊號線表明是IO空間還是記憶體空間,如果只是記憶體空間,看該地址落在的地址範圍確定是IO還是記憶體模組。


記憶體對映I/O 優點:

  1. 對於記憶體對映I/O, I/O裝置驅動程式可以完全用C語言編寫,避免了彙編的使用 。
  2. 對於記憶體對映I/O,不需要特殊的保護機制來阻止使用者程序執行I/O操作。
  3. 對於記憶體對映I/O,可以引用記憶體的每一條指令也可以引用控制暫存器。

記憶體對映I/O 缺點:

  1. 對於記憶體對映I/O,硬體必須針對每個頁面禁用快取記憶體。
  2. 對於記憶體對映I/O,I/O裝置沒有辦法檢視記憶體地址,因為記憶體地址旁路到記憶體總線上,所以沒有辦法響應。

5.1.4 直接儲存器存取

CPU需要定址裝置控制器以便於他們進行交換資料。CPU可以從I/O控制器每次請求一個位元組的資料,但是這樣做浪費了CPU 時間,所以經常使用到的是一種稱為直接儲存器存取(DMA)的方案。

在這裡插入圖片描述

在使用正常磁碟讀取時控制器從磁碟驅動器序列地一位一位讀取一個塊,知道整塊資訊放入控制器的內部緩衝區。緊接著,校驗,然後產生中斷。當作業系統開始允許時,它重複地從控制器的緩衝區中一次一個位元組或一個字得區域該塊資訊,並存入記憶體。

DMA的工作原理:

  1. CPU通過設定DMA控制器的暫存器對它進行程式設計,所以DMA控制器知道將生命資料傳送到什麼地方。DMA控制器還要向磁碟控制器發出一個命令,通知它從磁碟讀取資料到內部緩衝區中,並且對校驗和進行校驗。如果磁碟控制器的緩衝區的資料是有效的,那麼DMA就可以開始了
  2. DMA控制器通過總線上發出一個讀請求到磁碟控制器而發出DMA傳送。
  3. 磁碟控制器將資料傳送到記憶體中。
  4. 當寫操作完成時,磁碟控制器在總線上發出一個應答到DMA控制器上。

DMA控制器的資料傳送三種模式:

  1. 每次一字模式:DMA每次請求傳送一字,若CPu也想用匯流排,則必須等待。這一機制稱為週期竊取,因為裝置控制器偶爾從CPU偷走一個臨時的匯流排週期,從而輕微延遲CPU。
  2. DMA每次一塊模式:在塊模式中,DMA控制器通知裝置獲得匯流排,發起一連串的傳送,然後釋放匯流排。這一操作模式稱為突發模式,這種方法比周期竊取效率更高。而缺點在於,如果正在進行長時間突發操作,有可能將CPU和其他裝置阻塞相當長的時間。
  3. 飛越模式:DMA通知裝置暫存器直接將資料傳送到主存,某些DMA則是讓裝置先將資料傳送到DMA控制器,然後DMA發起第二個匯流排週期,缺點是效率低,優點是靈活。

控制器從磁碟讀取資料後為什麼不立即將其儲存在主存中?

  1. 通過進行內部快取,磁碟控制器可以在開始傳送資料之前進行校驗和。
  2. 一旦磁碟傳送開始工作,從磁碟讀取資料都是以固定速率到達的,而不論控制器是否準備好接受資料。

5.1.5 重溫中斷

在這裡插入圖片描述

中斷的工作原理如下:當一個IO裝置完成交給它的工作時,就會產生一箇中斷(假設作業系統以及放開中斷),它是通過分配給它第一條匯流排訊號線上置其的訊號而產生中斷的。該訊號被主機板上的中斷控制器晶片監測到,由中斷控制器晶片決定做什麼。

中斷訊號導致CPU停止當前正在做的工作並且開始做其它的事情。地址線上的數字被用作指向一個稱為中斷向量的表格的索引,以便讀取一個新的程式計數器。

在開始服務程式之前,硬體總是要儲存一定的資訊。作為最低限度,必須儲存程式計數器,而另一個極端,所有可見的暫存器和許多內部暫存器都要儲存。

5.2 I/O 軟體原理

在設計IO軟體時一個關鍵的概念是裝置獨立性。其意思是可以訪問任意IO裝置而無須實現指明裝置。

與裝置獨立性密切相關的是統一命名——一個檔案或裝置的名字應該是一個簡單的字串或一個證書,不應該原來裝置。

IO軟體另外的一個重要問題是錯誤處理。一般來貨,錯誤應該儘可能地在接近硬體的層面得到處理。在許多情況下,錯誤恢復可以在可以在低層透明地的得到接近,而高層軟體甚至不知道存在這一錯誤。

另一個關鍵問題是同步(即阻塞)和非同步(中斷驅動)傳輸。大多數物理IO是非同步的——CPU啟動傳輸時就去做其它工作,直到中斷髮生。如果IO操作是阻塞的,那麼程式更容易編寫。只是作業系統使實際上是終端驅動的操作變成來使用者看開是阻塞式的操作。

IO軟體另一個問題是緩衝。資料離開一個裝置之後通常並不能直接存放其最終的目的地,因此需要緩衝。緩衝涉及大量的複製工作,並且經常對IO效能有重大影響。

在I/O操作中科研採用三種根本上不同的方式實現。分別是程式控制I/O、中斷驅動I/O、使用DMA的I/O。

5.2.2 程式控制I/O

該方法首先在使用者空間的一個緩衝區組裝字串。然後作業系統(通常)將字串緩衝區複製到核心空間中國年的一個數組中,在這裡訪問更加容易(核心可能要通過修改記憶體對映才能到達使用者空間)。一旦印表機可用,作業系統就複製第一個自負到印表機的資料暫存器中。一旦將第一個字元複製到印表機,作業系統就要檢視印表機是否就緒準備接收另一個字元。印表機一般有第二個暫存器使用者表明狀態。將字元寫到資料暫存器的操作導致狀態變為非就緒。當印表機完成當前字元時,則通過在狀態暫存器中設定某一位或將某個值放在其中來表示可用。

在輸出一個字元之後,CPu要不斷地查詢裝置以瞭解它是否就緒準備接收另一個字元。這哦一行為通常稱為輪詢或忙等待。

5.2.3 中斷驅動I/O

這種允許CPU在等待印表機變為就緒的同時做某些其他事情的方式就是使用中斷。

CPU要呼叫排程程式,並且某個其他程序將允許,請求列印字串的程序將被阻塞,直到整個字串列印完。

當印表機將字元列印完並且準備好接收下一個字元時,它將長恨惡搞一箇中斷。這一中斷將停止當前程序並且儲存其狀態。

5.2.4 使用DMA的I/O

此處的思路是讓DMA控制器一次給印表機提供一個字元,而不打擾CPU。本質上,DMA是程式控制IO,只是由DMA控制器而不是主CPU做全部工作。這一策略需要特殊的硬體(DMA控制器),但是CPU獲得自由從而可以在I/O期間做更多的工作。

5.3 I/O 軟體層次

IO軟體通常組織成四個層次,每一層具有一個要執行的定義明確的功能和一個定義明確的與鄰近層次的介面。

在這裡插入圖片描述

5.3.1 中斷處理程式

應當將中斷隱藏在作業系統內部:將啟動一個IO操作的驅動程式阻塞起來,直到IO操作完成併產生一箇中斷。

當中斷髮生時,中斷程式將做它必須要做的全部工作以便對中斷進行處理,然後,他可以啟動中斷的驅動程式以解除阻塞。中斷的最終結果是使先前被阻塞的程式能夠繼續執行。

5.3.2 裝置驅動程式

每個連線到計算機上的IO裝置都需要某些裝置特定的程式碼來對其進行控制,即裝置驅動程式。

每個裝置驅動程式通常處理一種型別的裝置,不過在有時候,極其不同的裝置卻基於相同的底層技術,如USB。

為了訪問裝置的硬體,裝置驅動程式通常必須是作業系統核心的一部分。

在這裡插入圖片描述

作業系統通常將驅動程式分類:塊裝置(磁碟)和字元裝置(鍵盤)

大多數作業系統定義了標準介面(塊裝置或字元裝置)

驅動程式的功能:

  1. 接受上方與裝置無關的讀寫請求,並且目睹執行
  2. 啟動時檢查引數
  3. 檢查裝置是否在被使用

控制裝置意味著向裝置發出一系列命令,根據裝置必須要做的工作,由驅動程式處確定命令序列。

命令發出後,會牽扯到兩種情況:阻塞(可以被中斷喚醒)和不阻塞。

驅動程式必須是重入的,即一個正在執行的驅動程式必須預料到在第一次呼叫完成之前第二次被呼叫。

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

裝置驅動程式和與裝置無關的軟體之間的確切界限依賴於具體系統。

與裝置無關的軟體的基本功能是執行對所有裝置公共的IO功能,並且向用戶軟體一個統一的介面。

1. 裝置驅動程式的統一介面

在這裡插入圖片描述

所有裝置都有主裝置號(定位驅動程式)、次裝置號(作為引數傳遞給驅動程式,確定要讀寫的具體單元)。

裝置保護:裝置是作為命名物件出現在檔案系統中的,這意味著針對檔案的常規保護規則也適用於IO裝置。

2. 緩衝

在這裡插入圖片描述

方案一的問題:使用者程序執行多次效率較低。

方案二的問題:分頁問題

方案三的問題:調頁面時新字元的到來問題,使用雙緩衝(方案四)解決。

緩衝的另一種形式:迴圈緩衝區。

3.錯誤報告

錯誤在I/O上下文比其他上下文中要常見的多。當錯誤發生的時候,作業系統必須盡最大的努力對他們進行處理。許多錯誤都是特定的並且必須由適當的驅動程式來處理,但是錯誤的處理如裝置無關。

  1. 程式設計錯誤。
  2. 實際的I/O錯誤

4.分配與釋放專有裝置

5. 與裝置無關的塊大小

5.3.4 使用者空間的I/O軟體

大部分IO軟體都在作業系統內部,但是仍有一小部分在使用者空間,包括與使用者程序連線在一起的庫,甚至完全運行於核心之外的程式。

  1. 系統呼叫通常由庫的形式實現。
  2. 假離線系統,是多道程式設計系統中處理獨佔IO裝置的一種方法。
  3. 特殊程序,稱為守護程序,以及一個特殊目錄,稱為假離線目錄。一個程序要列印一個檔案的時候,並且將其放在假離線目錄下。由守護程序列印這個目錄下的檔案,該程序是允許使用印表機特殊檔案的唯一程序。

在這裡插入圖片描述

接下來我們對整個I/O系統進行總結,給出所有層次以及每一個層次的功能。從底部開始,這些層次分別是硬體、中斷處理程式、裝置驅動程式、與裝置無關的軟體、最後是使用者程序。

當一個使用者程序從一個檔案中毒一個快的時候,作業系統被呼叫以實現這一請求。與裝置無關的軟體在緩衝區中快取記憶體中查詢有無要讀的塊。如果需要的塊不在其中,則呼叫裝置驅動程式,向硬體發出一個請求,讓他從磁碟中獲取該塊。然後,程序被阻塞直到磁碟操作完成並且資料在呼叫者的緩衝區中安全可用。

5.4 盤

5.4.1 盤硬體

磁碟具有讀寫速度同樣快的特點,這使得它們適合作為輔助儲存器。這些盤的陣列有時用來提供高可靠性的儲存器。

1. 磁碟

扇區-》磁軌(與垂直堆疊的磁頭個數相同)-》柱面-》磁碟

重疊尋道:控制器同時控制多個驅動器進行尋道。

硬碟可以可以在多個驅動器上同時讀寫,軟盤不能

現代磁碟被劃分為環帶,外層的環帶比內層的環帶擁有更多的扇區。

為了隱藏每個磁軌有多少扇區,大多數現代磁碟都有一個虛擬幾何規格呈現給作業系統。

在這裡插入圖片描述

2. RAID

由於CPU和磁碟效能差距越來越大,找尋特殊磁碟組織來改進磁碟效能。並行IO操作來提高CPU效能。

RAID:將一個裝滿了磁碟(SCSI)的盒子安裝到計算機,用RAID控制器替換磁碟控制器卡,而軟體看起來就是一個磁碟。,將所有資料分佈在全部驅動器上,這樣就可以並行操作。

RAID的七種標準配置(0級到6級)

在這裡插入圖片描述

5.4.2 磁碟格式化

在磁碟能夠使用之前,每個碟片必須經受由軟體完成的低階格式化。

扇區:前導碼+資料+ECC(恢復讀錯誤)

柱面斜進:第0扇區位置與前一個磁軌存在偏移,便於讀取多個磁軌的資料。

在這裡插入圖片描述

磁頭斜進

低階格式化的結果是磁碟容量減少,所以一般買的磁碟容量不等於可用的磁碟容量。

格式化還對效能產生影響

交錯方式編號扇區:單交錯雙交錯 解決連續讀,緩衝不夠大的問題。

在這裡插入圖片描述

低階格式化完成之後,要對磁碟分割槽,邏輯上每個分割槽是一個獨立的磁碟

0扇區包含主引導記錄(MBR):包含某些引導程式碼以及處在扇區末尾的分割槽表(CDEF)

新系統支援GPT(因為磁碟容量在變大)

準備一塊磁碟可用的最後一步是 高階格式化

開啟電源-》bios讀入主引導記錄並跳轉到主引導記錄-》這一載入程式進行檢查瞭解哪個分割槽是活動的-》引導扇區中的載入程式搜尋檔案系統以找到作業系統核心-》該程式被裝入記憶體並執行

5.4.3 磁碟臂排程演算法

讀寫磁碟塊需要的時間:尋道時間(主導地位)+旋轉延遲+實際資料傳輸時間

先來先服務(FCFS):每個磁碟驅動程式都維護一張表,每一個柱面未完成的請求組成一個連結串列,連結串列頭存放在相應表目中。

最短尋道優先(SSF):下一次總是處理與磁頭距離最近的請求以使尋道時間最小化

在這裡插入圖片描述

缺點:遠離中部區域的請求得到的服務很差,有失公平。
電梯演算法

在這裡插入圖片描述

某些磁碟控制器提供了一種方法供軟體檢查磁頭下方的當前扇區號。由此有多種優化。
許多磁碟控制器總是讀出多個扇區並對其進行快取記憶體。完全獨立於作業系統的快取記憶體

5.4.4 錯誤處理

壞扇區處理辦法:在控制器中對它們進行處理或者在作業系統中

控制器中處理壞塊的辦法:

在這裡插入圖片描述

5.4.5 穩定儲存器

穩定儲存器:要麼正確寫,要麼什麼也不做,保證資料絕對正確

可能發生的錯誤:ECC正確概率低、扇區可能自發變壞、CPU可能出故障

穩定儲存器使用一對完全相同的磁碟,無差錯時,兩者完全相同。

穩定寫、穩定讀、崩潰恢復

穩定寫期間CPU崩潰的五種可能性:

在這裡插入圖片描述

優化和改進:在穩定寫期間跟蹤(非易失性RAM)被寫的是哪個塊,這樣在恢復的時候必須被檢驗的塊只有一個

每天都要掃描兩個磁碟,防止兩者同時變壞。

5.5 時鐘

時鐘又稱為定時器,負責維護時間,防止一個程序壟斷CPU。

5.5.1 時鐘硬體

有兩種型別:比較簡單的、可程式設計時鐘

可程式設計時鐘的幾種操作模式: 一次完成模式、方波模式(產生時鐘滴答)

優點:中斷頻率可以由軟體控制

為了防止計算機的電源被切斷時丟失時間,有備份時鐘或者開機網路同步。

5.5.2 時鐘軟體

除了中斷由時間硬體完成,其他功能實現都由時鐘軟體實現

  1. 維護日時間

在這裡插入圖片描述

  1. 防止程序超時執行
  2. 對CPU的使用情況記賬
  3. 處理使用者程序提出的alarm系統呼叫

在這裡插入圖片描述
5. 為系統本身的各個部分提供監視定時器
6. 完成概要剖析、監視和統計資訊收集

5.5.3 軟定時器

管理IO的兩種方法:中斷和查詢

軟定時器避免了中斷,該定時器是主系統定時器以外的。

軟定時器隨著其他原因進入核心的頻率而脈動

5.6 使用者介面:鍵盤、滑鼠和監視器

5.6.1 輸入軟體

1. 鍵盤軟體

IO埠中的每個數字是鍵的編號,稱為編號碼,一共128個鍵,所以只需7個位

原始模式(面向字元) 加工模式(面向行)

回顯(剛剛鍵入的字元出現在螢幕上)

回車:回到第一列 換行:到下一行 Enter鍵是回車換行

在這裡插入圖片描述

2. 滑鼠軟體

滑鼠步:計算機有反應的最小移動距離,大約是0.1mm
發到計算機的三個專案:Δx、Δy、按鈕

5.6.2 輸出軟體

1.文字視窗

移動游標的方法:1.轉義序列 2. termcap

標準化轉義序列:ANSI標準

2.X視窗系統

X伺服器(在本機內部):採集輸入並輸出在螢幕上的軟體,與X客戶(可能在遠方伺服器上)進行通訊.

在這裡插入圖片描述

從程式到工作站的命令不面向連線,當需要來自工作站的資訊時,是面向連線的

X是高度事件驅動的

X中一個關鍵概念是資源

3.圖形使用者介面(GUI)

輸入使用鍵盤滑鼠,輸出使用圖形介面卡,包含有視訊RAM

螢幕上的基本專案:視窗

在這裡插入圖片描述

Windows是面向訊息的,而linux是面向事件的

GDI:螢幕的實際繪圖,繪製之前,要先獲取一個裝置上下文。

在這裡插入圖片描述

4. 點陣圖

複製圖的方法:windows元檔案、點陣圖(每一個網格方塊的平均紅、綠、藍取值被取樣並且儲存為一個畫素的值)

在這裡插入圖片描述

DIB:便於在不同裝置之間移動點陣圖

5.字型

TrueType字型:不是點陣圖而是輪廓,通過圍繞其周界的一系列點來定義

首先縮放然後柵欄化。
###6.觸控式螢幕

電阻屏(不支援多點觸控)、電容屏

5.7 瘦客戶機

主流計算正規化一直在中心化計算和分散化計算之間震盪。

大部分使用者想要高效能的互動式計算,但是實在不想管理一臺計算機,於是分時系統使用的瘦客戶機出現了(Chromebook)

5.8 電源管理

減少能量消耗的一般方法:1.某些部件(IO)不用時作業系統關閉他們 2.應用程式使用較少的能量

5.8.1 硬體問題

電池:1.一次性 2.可再充電的

耗能:工作>睡眠>休眠>關機

在這裡插入圖片描述

5.8.2 作業系統問題

找到演算法和啟發式方法,讓作業系統對關於關閉什麼裝置以及何時關閉做出良好的決策。

1.顯示器

定期關閉螢幕

在這裡插入圖片描述

2.硬碟

一個停止的磁碟是休眠而不是睡眠,重啟會消耗相當多的時間與能量,設定一個特徵時間來決定是否停轉。

或者在RAM中擁有一個大容量磁碟快取記憶體。

或者作業系統通過傳送資訊或訊號保持磁碟的狀態通知給正在執行的程式。

3.CPU

CPU電壓、時鐘週期、電能損耗之間存在關係

在這裡插入圖片描述

慢速執行比快速執行具有更高的能量效率

放慢CPU核不總是意味著效能的下降

4.記憶體

節能方法:1.重新整理然後關閉快取記憶體(睡眠狀態) 2.將主存的內容寫到磁碟上,然後關閉主存本身(休眠)

5.無線通訊

由使用者或者週期性關閉無線電裝置

6.熱量管理

風扇問題、週期性接入點問題、

7.電池管理

智慧電池

8.驅動程式介面

ACPI(高階配置與電源介面):作業系統讓裝置報告當前狀態、命令驅動程式削減能耗或正常運轉

5.8.3 應用程式問題

指示程式使用較少的能量