1. 程式人生 > >第五章 裝置管理 使用者層IO軟體 緩衝 磁碟

第五章 裝置管理 使用者層IO軟體 緩衝 磁碟

使用者層的I/O軟體
小部分I/O系統軟體放在了使用者應用層上。
庫函式(與應用程式連結)
假離線技術(虛擬裝置)

1)系統呼叫與庫函式
不允許執行在使用者態的應用程序,去直接呼叫執行在核心態(系統態)的OS過程。
應用程序在執行時,又必須取得OS所提供的服務。
於是:
OS在使用者層中引入了系統呼叫,應用程式可以通過它,間接呼叫OS中的I/O過程,對I/O裝置進行操作。
待第9章討論

2)裝置分配中的虛擬技術 —— SPOOLing技術

虛擬性是OS的四大特徵之一。
多道程式技術將一臺物理CPU虛擬為多臺邏輯CPU,實現多個使用者共享一臺主機;
如何將一臺物理I/O裝置虛擬為多臺邏輯I/O裝置,允許多個使用者共享“同時使用” ?

假離線技術
多道程式技術,專門利用程式模擬離線I/O的外圍機,完成裝置I/O操作。
稱這種聯機情況下實現的同時外圍操作為SPOOLing 技術(Simultaneaus Periphernal Operating On—Line,或稱為假離線操作)
一般程序對獨佔裝置的需求被假離線模擬到磁碟上。所以實現裝置虛擬,多道是前提,還需高速、大容量、可隨機存取的外存支援。

SPOOLing系統的組成
主要有三大部分(如下頁圖)
輸入井和輸出井:磁碟上開闢兩大儲存空間。輸入井模擬離線輸入的磁碟裝置,輸出井模擬離線輸出時的磁碟。
輸入緩衝區和輸出緩衝區:為緩解速度矛盾,記憶體中開闢兩大緩衝空間,輸入緩衝區暫存輸入裝置送來的資料,再送給輸入井;輸出緩衝區暫存輸出井送來的資料,再送輸出裝置。
輸入程序和輸出程序。
用一程序模擬離線輸入時外圍裝置控制器的功能,把低速輸入裝置上的資料傳送到高速磁碟上;
用另一程序模擬離線輸出時外圍裝置控制器的功能,把資料從磁碟上傳送到低速輸出裝置上。

在這裡插入圖片描述
SPOOLing技術的使用:
當用戶程序請求列印輸出時,SPOOLing系統同意為它列印輸出,但並不真正立即把印表機分配給使用者程序,而只為它做兩件事:
①由輸出程序在輸出井中為之請求一個空閒磁碟塊區,並將要列印的資料送入其中.
②輸出程序再為使用者程序申請一張空白的使用者請求打印表,並將使用者的列印要求填入其中,再將該表掛在請求列印佇列上.

列印輸出過程:
如果印表機空閒,輸出程序將從請求列印佇列的隊首取出一張請求打印表,根據表中的要求將要列印的資料,從輸出井傳送到輸出緩衝區,再由印表機進行列印.
列印完畢後,輸出程序再檢視請求列印佇列中是否還有等待列印的請求表,如此下去,直至請求列印佇列為空,輸出程序才將自己阻塞起來.
僅當下次再由列印請求時,輸出程序才被喚醒.

守護程序
守護程序(Daemon)是執行在後臺 的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。守護程序是一種很有用的程序。
Linux的大多數伺服器就是用守護程序實現的。比如,Internet伺服器inetd,Web伺服器httpd等。同時,守護程序完成許多系統任務。比如,作業規劃程序crond,列印程序lpd等。

利用守護程序實現印表機
①為印表機建立一個守護程序,由它執行一部分原來由假離線管理程序功能的功能。
②由請求程序生成一份要求列印的檔案,並將使用者請求列印檔案放入假離線檔案佇列(目錄)中。

印表機屬於獨佔裝置,利用SPOOLing技術可將其改造為一臺可供多個使用者共享的裝置。
見課本說明:
核心就是不能交叉列印的資料,虛擬的列印在磁碟的輸出井上(而磁碟的非獨佔性解決了印表機不能方便共享的問題)。
有列印輸出請求的程序申請“請求打印表”。
資料虛擬列印到“輸出井”
Spooling程式再按“請求表佇列”分配真正的印表機列印資料。

SPOOLing系統的特點
提高了I/O的速度。利用輸入輸出井模擬成離線輸入輸出,緩和了CPU和I/O裝置速度不匹配的矛盾。
將獨佔裝置改造為共享裝置。並沒有為程序分配裝置,而是為程序分配一儲存區和建立一張I/O請求表。
最終,實現了虛擬裝置功能。多個程序可“同時”使用一臺獨佔裝置。

緩衝區管理

有”控制器”或”通道”的幫助後CPU可解放去做其他事物,提高了利用率。
但分析單個程式內的執行
CPU計算工作需等待後續資料輸入才可繼續
CPU計算需等待資料輸入完才能計算,雖然資料輸入不需CPU干預,但CPU的解放也只是能去做其他程式,需切換工作,會產生開銷。

一程序中“CPU計算速度”和“裝置I/O速度”仍存在不匹配的矛盾。
解決:CPU進行當前計算時,裝置進行後續資料的輸入(——緩衝區)。

在這裡插入圖片描述

緩衝管理
I/O控制方式減少CPU對I/O的干預提高利用率;
緩衝則通過緩和CPU和I/O裝置速度不匹配矛盾,增加CPU和I/O裝置的並行性,提高利用率。
現代OS中,幾乎所有的I/O裝置與處理機交換資料時,都用了緩衝區。

引入緩衝區的主要原因:
緩和CPU與I/O裝置間速度不匹配的矛盾。
緩衝區資料成批傳入記憶體,也可進一步減少對CPU的中斷頻率
最終目的:提高CPU和I/O裝置的並行性。
使用緩衝區的方式:
1)單緩衝、多緩衝
2)迴圈緩衝
3)緩衝池(Buffer Pool)

1)單緩衝與多緩衝

單緩衝(Single Buffer)
每當使用者程序發出一I/O請求時,

在這裡插入圖片描述
單位:字元裝置輸入時,緩衝區用於暫存使用者輸入/輸出的一行資料;塊裝置輸入則是成塊資料。
在這裡插入圖片描述

雙緩衝(Double Buffer)
進一步加快輸入和輸出速度,提高裝置利用率制,也稱緩衝對換(Buffer Swapping)
輸入:資料送入第一緩衝區,裝滿後轉向第二緩衝區。
讀出:OS從第一緩衝區中移出資料,送入使用者程序,再由CPU對資料進行計算。
兩個緩衝區,CPU和外設不再針對一塊交替
可能實現連續處理無需等待對方。前提是CPU和外設對一塊資料的處理速度相近。而如下圖情況CPU仍需等待慢速裝置。
在這裡插入圖片描述

在這裡插入圖片描述
多緩衝引入
I/O與CPU速度基本相匹配,採用雙緩衝能獲得較好的效果,基本上能並行操作。
但,若兩者的速度相差甚遠,雙緩衝的效果仍不夠理想;
為進一步協調速度差,可增加緩衝區數量,同時進行一定的多緩衝管理入和出的同步。
引入多緩衝機制。組織形式:迴圈緩衝、緩衝池。

2)迴圈緩衝(circular buffer)
在這裡插入圖片描述

①迴圈緩衝的組成
多個緩衝區。大小相同,三種類型:
預備裝輸入資料的空緩衝區R
裝滿資料的緩衝區G
計算程序正在使用的現行工作緩衝區C
多個指標。
指示正在使用的緩衝區C的指標Current
指示計算程序下一個可取的緩衝區G的指標Nextg
指示輸入程序下次可放的緩衝區R的指標Nexti

②迴圈緩衝區的使用
計算程序(CPU)和輸入程序(I/O操作)可利用兩個過程來使用迴圈緩衝區。
主要就是利用指標,操作上述不同型別緩衝區
Getbuf過程:使用緩衝區時,可呼叫該過程
計算程序取:current=Nextg,G—>C,nextg下移一個。
輸入程序放:current=nexti,R—>C,nexti下移一個
Releasebuf過程:
計算程序:C->R
輸入程序:C->G

一個時段只能用於輸入或輸出,不能同時雙向通訊

③程序同步

兩個程序的控制:輸入程序和計算程序並行執行,如何控制相應的兩個指標不斷順時針方向移動,這樣就可能出現兩種情況:
Nexti趕上Nextg。意味著輸入速度大於計算速度,緩衝區滿,只能阻塞輸入程序等計算程序取,此情況稱為系統受計算限制。
Nextg趕上Nexti。意味著輸入速度低於計算速度,緩衝區空,只能阻塞計算程序等輸入程序放,此情況稱為系統受I/O限制。

3)緩衝池(Buffer Pool)
迴圈緩衝的問題
不能同時雙向通訊
利用率不高。緩衝區是專用緩衝。(每個程序都要維護自己的一個迴圈緩衝區),使用有剩餘時也不給其他程序使用,消耗大量記憶體空間。
系統併發程式很多時,許多這樣的迴圈緩衝需要管理,比較複雜。
為提高緩衝區的利用率,目前廣泛流行緩衝池,在池中設定多個可供若干個程序共享的緩衝區。

系統將多個緩衝區形成一個緩衝池。
池中緩衝區為系統中所有的程序共享使用(如UNIX系統在塊裝置管理中設定了一個15個緩衝區組成的緩衝池)
組織形式:佇列及佇列指標

在這裡插入圖片描述

①緩衝池的組成
對於既可輸入又可輸出的公用緩衝池,至少應含有下列三種類型的緩衝區:
空緩衝區;
裝滿輸入資料的緩衝區;
裝滿輸出資料的緩衝區;
為方便管理,將上述型別相同的緩衝區連成佇列
空緩衝區佇列(所有程序都可用)
輸入佇列(n個程序有各自的佇列)
輸出佇列(n個程序有各自的佇列)
*(佇列長度不固定,根據程序實際情況靈活變動,需要多少用多少)

工作狀態決定了current有四種工作緩衝區:
狀態 操作者
收容輸入資料的工作緩衝區;hin
提取輸入資料的工作緩衝區;sin
收容輸出資料的工作緩衝區;hout
提取輸出資料的工作緩衝區;sout

②緩衝區的工作方式
四種工作方式:
收容輸入:Getbuf(emq),hin;輸入資料填入一空緩衝區;Putbuf(inq,hin)
提取輸入: Getbuf(inq),sin;從輸入緩衝佇列中取出一資料區的內容;Putbuf(emq,sin)
收容輸出: Getbuf(emq),hout;輸出資料填入一空緩衝區;Putbuf(outq,hout)
提取輸出: Getbuf(outq),sout;從輸出緩衝佇列中取一資料區的內容;Putbuf(emq,sout)

在這裡插入圖片描述
緩衝區的使用
Getbuf(佇列,工作區)
Putbuf(佇列,工作區)
同步控制
每隊設定一個互斥訊號量MS;
判斷每個佇列是否有可用的緩衝區,需一個資源訊號量RS。獲取緩衝區時P(RS),釋放時V(RS)。
緩衝池:可雙向緩衝;緩衝區整體利用率高。

磁碟儲存器的效能和排程
磁碟效能簡述
磁碟排程方法
磁碟快取記憶體
提高速度的其他方法

1)磁碟效能簡述
首先與格式有關
資料的組織和格式
碟片、面、磁軌、扇區
為方便處理,每條磁軌儲存容量相同,每個磁軌上的每個扇區相當於一個盤塊。磁碟”格式化”的過程就是按規定的格式規劃盤塊。

如溫盤格式:
每道30個扇區,每扇600個位元組。512位元組用於存放資料,其餘存放控制資訊。
識別符號欄位:標識一個扇區的資訊記錄; 1+2+1+1+3 bytes
資料欄位:每個扇區存放資料的空間。
資料前後還有若干特定功能位元組。 1+512+2 byte
在這裡插入圖片描述

與速度有關
磁碟型別
固定磁頭(每道一磁頭)
移動磁頭(每盤一磁頭)
訪問時間的計算
尋道時間(到磁軌)
旋轉延遲(到扇區)
傳輸時間
傳輸時間佔總時間的比例最小,磁碟讀寫速度的提高要選擇合適的排程演算法,減少前兩項用時,使所有作業的磁碟處理時間均衡。

2)磁碟排程方法
對所有請求訪問磁碟的程序進行合理排程,使對磁碟的平均訪問時間最小。
目標:使平均尋道時間最少。
演算法:
FCFS
最短尋道時間優先SSTF
掃描演算法SCAN(磁碟電梯排程演算法)
迴圈掃描演算法CSCAN
N-Step-SCAN演算法
FSCAN演算法

①FCFS
多個程序的磁碟I/O請求構成一個隨機分佈的請求佇列。
磁碟I/O執行順序按磁碟請求的先後順序。

在這裡插入圖片描述

②最短尋道時間優先SSTF ShortestSeekTimeFirst

選擇從當前磁頭位置出發移動最少的磁碟I/O請求
使每次磁頭移動時間最少。
不一定是最短平均柱面定位時間,但比FIFO演算法有更好的效能。
對中間的磁軌有利,但可能會有程序處於飢餓狀態(I/O請求總不被執行)。
在這裡插入圖片描述

設當前在100磁軌上;
程序要求的訪問順序:55,58,39,18,90,160,150,38,18
在這裡插入圖片描述
③掃描演算法SCAN(磁碟電梯排程演算法)
SSTF會導致“飢餓”現象
總選擇最近的磁軌訪問,遠磁軌請求的程序會長時間得不到執行。
改進:
考慮距離的同時,更優先考慮方向
SCAN演算法
規定磁頭移動方向:自裡向外,再自外向裡移動。
後續的I/O磁軌請求,哪個在規定方向上距離最近,就先執行哪個。
如當前為100,後續要求55,86,95,180,165,105
先由內向外:選最近的105執行,再判斷剩餘的,選165,180。
再由外向內:95,86,55

反方向較近的55號磁軌請求的程序相對“飢餓”很久

迴圈掃描CSCAN
SCAN的錯過問題:
容易錯過與當前磁軌距離近,但方向不一致的磁軌。
修改:將SCAN規定的移動方向改為“單向移動”
由裡向外後,再由裡向外。
N-Step-SCAN
前述最近尋道演算法共同問題:
“磁臂粘著”——磁頭靜止在一個磁軌上,導致其它程序無法及時進行磁碟I/O。(因:高密度盤,程序的讀寫可能集中在某一磁軌)
如現有一系列請求:
3 3 5 2 3 3 3 2 3 3 2 3 3 4 4 5 2 3 3 3 4 4 2 3 3 3 2 2 2 3
不管哪種演算法,從3開始向下執行會是
3 3 3 3 3 3 3 3 3 3….2 2 2 2 2 2 … 4 4 ….

改進:
將磁碟請求佇列分成長為N 的子佇列
按FCFS選擇子佇列。佇列內又按SCAN演算法。
3 3 5 2 |3 3 3 2| 3 3 2 3| 3 4 4 5| 2 3 ….2 3
處理子佇列過程中產生的新I/O再依次排佇列。
N=1時,就是FCFS,N很大時就是SCAN。

F-SCAN
N-Step-SCAN的簡化:
請求佇列只分為兩個子佇列
當前一個佇列,按SCAN演算法執行;
掃描期間新生成的組成一個佇列,等待被掃描。

假設一個活動頭磁碟有200道,編號從0-199。當前磁頭正在155道上服務,並且在此之前完成的是173道的訪盤請求。
現有如下訪盤請求序列(磁碟號):75,168,81,138,87,143,187,129,198,44。試給出採用下列演算法後磁頭移動的順序和移動總量(總磁軌數)。
1.最短尋道時間優先(SSTF)磁碟排程演算法。
2.掃描法(SCAN)磁碟排程演算法(假設沿磁頭移動方向不再有訪問請求時, 磁頭就沿相反方向移動。 44到0磁軌的移動忽略不計)

答:1.SSTF磁頭移動順序:
155,143,138,129,168,187,198,87,81,75,44
三段(155~129,129~198,198~44)
移動總量=155-129+198-129+198-44=249

2.SCAN:
155,143,138,129,87,81,75,44,168,187,198
兩段(155~44,44~198)
移動總量=155-44+198-44=265