6.用戶層的I/O軟件
小部分I/O系統軟件放在了用戶應用層上。
????庫函數(與應用程序鏈接)
????假脫機技術(虛擬設備)
1)系統調用與庫函數
不允許運行在用戶態的應用進程,去直接調用運行在核心態(系統態)的OS過程。
應用進程在運行時,又必須取得OS所提供的服務。
于是:
OS在用戶層中引入了系統調用,應用程序可以通過它,間接調用OS中的I/O過程,對I/O設備進行操作。
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請求表。
最終,實現了虛擬設備功能。多個進程可“同時”使用一臺獨占設備。
7.緩沖區管理
有”控制器”或”通道”的幫助后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)單緩沖、多緩沖
單緩沖(Single Buffer)
????每當用戶進程發出一I/O請求時,
????單位:字符設備輸入時,緩沖區用于暫存用戶輸入/輸出的一行數據;塊設備輸入則是成塊數據。
????OS在主存中為之分配一個緩沖區。
????CPU和外設輪流使用,一方處理完后等待對方處理。
雙緩沖(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)。
緩沖池:可雙向緩沖;緩沖區整體利用率高。
8.磁盤存儲器的性能和調度
1)磁盤性能簡述
首先與格式有關
數據的組織和格式
????盤片、面、磁道、扇區
????為方便處理,每條磁道存儲容量相同,每個磁道上的每個扇區相當于一個盤塊。磁盤”格式化”的過程就是按規定的格式規劃盤塊。
與速度有關
磁盤類型
????固定磁頭(每道一磁頭)
????移動磁頭(每盤一磁頭)
訪問時間的計算
????尋道時間(到磁道)
????旋轉延遲(到扇區)
????傳輸時間
傳輸時間占總時間的比例最小,磁盤讀寫速度的提高要選擇合適的調度算法,減少前兩項用時,使所有作業的磁盤處理時間均衡。
2)磁盤調度方法
對所有請求訪問磁盤的進程進行合理調度,使對磁盤的平均訪問時間最小。
目標:使平均尋道時間最少。
算法:
①FCFS
多個進程的磁盤I/O請求構成一個隨機分布的請求隊列。
磁盤I/O執行順序按磁盤請求的先后順序。
②最短尋道時間優先SSTF?ShortestSeekTimeFirst
選擇從當前磁頭位置出發移動最少的磁盤I/O請求
????使每次磁頭移動時間最少。
????不一定是最短平均柱面定位時間,但比FIFO算法有更好的性能。
????對中間的磁道有利,但可能會有進程處于饑餓狀態(I/O請求總不被執行)。
????掃描算法SCAN(磁盤電梯調度算法)
③掃描算法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算法執行;
????????掃描期間新生成的組成一個隊列,等待被掃描。