實驗五 磁盤管理實驗
一、實驗目的
1、 了解磁盤調度的策略和原理;
2、 理解和掌握磁盤調度算法——先來先服務算法(FCFS)、最短尋道時間優先算法(SSTF)、電梯掃描算法(SCAN)。
二、實驗內容
1、 模擬先來先服務法(First-Come, First-Served,FCFS),最短尋道時間優先法(Shortest Seek Time First, SSTF),電梯掃描算法(SCAN)三種磁盤調度算法;
2、 對三種算法進行對比分析。
3、 輸入為一組請求訪問磁道序列,輸出為每種調度算法的磁頭移動軌跡和移動的總磁道數。
三、實驗原理
1、先來先服務算法(FCFS): 按先來后到次序服務,未作優化。最簡單的移臂調度算法是“先來先服務”調度算法,這個算法實際上不考慮訪問者要求訪問的物理位置,而只是考慮訪問者提出訪問請求的先后次序。 采用先來先服務算法決定等待訪問者執行輸入輸出操作的次序時,移動臂來回地移動。先來先服務算法花費的尋找時間較長,所以執行輸入輸出操作的總時間也很長。
2、最短尋道時間優先算法(SSTF) : 最短尋找時間優先調度算法總是從等待訪問者中挑選尋找時間最短的那個請求先執行的,而不管訪問者到來的先后次序。與先來先服務、算法比較,大幅度地減少了尋找時間,因而縮短了為各訪問者請求服務的平均時間,也就提高了系統效率。但最短查找時間優先(SSTF)調度,FCFS會引起讀寫頭在盤面上的大范圍移動,SSTF查找距離磁頭最短(也就是查找時間最短)的請求作為下一次服務的對象。SSTF查找模式有高度局部化的傾向,會推遲一些請求的服務,甚至引起無限拖延(又稱飢餓)。
3、掃描算法(SCAN): SCAN 算法又稱電梯調度算法。SCAN算法是磁頭前進方向上的最短查找時間優先算法,它排除了磁頭在盤面局部位置上的往復移動,SCAN算法在 很大程度上消除了SSTF算法的不公平性,但仍有利於對中間磁道的請求。“電梯調度”算法是從移動臂當前位置開始沿着臂的移動方向去選擇離當前移動臂最近的那個柱訪問者,如果沿臂的移動方向無請求訪問時,就改變臂的移動方向再選擇。但是,“電梯調度”算法在實現時,不僅要記住讀寫磁頭的當前位置,還必須記住移動臂的當前前進方向。
四、實驗中用到的系統調用函數(包括實驗原理中介紹的和自己采用的),自己采用的系統調用函數要按照指導書中的格式說明進行介紹。
模擬程序沒有用到系統調用函數
五、實驗步驟
算法所用到的數據結構與變量:
1、vector<int>Distance:記錄每一次移動的磁道數。這里我沒有用普通的int變量累加的方式計算總的磁道數,而是記下每次移動的磁道數。因為我想記下在移動過程中每一步驟的移動步伐,可以查詢從哪里移動到哪一步時的移動的距離。而不是單純為了得到一個最終結果。
2、vector<int>request:請求磁道序列
3、int DiskCount:請求磁道的個數
4、int *SSTF_TempDisk:SSTF算法用到的記錄當前磁道與每個請求磁道的距離
5、int *SCAN_TempDisk:SCAN算法用到的記錄當前磁道與每個請求磁道的距離
6、int SSTF_count:SSTF算法用到的記錄移動次數
7、int SCAN_count:SCAN算法用到的記錄移動次數
8、int SCAN_dir:SCAN算法用到的掃描方向,1代表由里向外,-1代表由外向里。
算法思路:
1、FCFS算法:
按順序讀出請求磁道,依次移動,並計算移動的磁道數且記下。對移動的磁道數進行累加,便可以獲得總的磁道移動數。
2、SSTF算法:
以遞歸的方式,每次尋找與當前磁道距離最近的請求磁道,並以此作為當前磁道遞歸調用SSTF函數繼續執行。
3、SCAN算法:
先規定初始掃描方法為由里向外,即由小到大。基於遞歸的方式,先計算當前磁道與請求磁道的距離,找出距離最小且磁道數大於當前磁道數的磁道,如果找到,則以此磁道為當前磁道,繼續遞歸,如找無,則證明該方向上已無請求磁道,轉變方向,在另一方向上找到與當前磁道距離最近的磁道,以此為當前磁道繼續遞歸。
算法優化:
SCAN算法的目的是實現在一個方向上順序移動磁道,遇到有請求的進行,直至該方向上沒有請求磁道。在這里我們可以換種想法,拋棄上面的思路。由於實驗為靜態的請求序列,我們可以提前將請求磁道序列進行排序,再找到初始位置,以該位置為起點向一個方向輸出,直至盡頭后再轉換方向往另一邊輸出至盡頭。磁頭的移動軌跡與上述算法相同,但時間復雜度大大降低。
主程序流程圖:

六、實驗結果分析(截屏的實驗結果,與實驗結果對應的實驗分析)
實驗要求磁道個數范圍在[0,1000]之間,在實現輸出方面由於隨機產生的磁道個數越大時磁道軌跡也就越長,一頁圖片放不下,也不容易觀察,故在此重復執行實驗時選取個數較少的實驗結果進行展示,在最后也展示了一次個數較多的情況。
在下圖可以發現,FCFS算法按照先來先服務規則移動磁頭。其磁頭移動軌跡按照磁道請求序列的順序移動,
觀察SSTF磁頭移動軌跡,可以發現磁頭下一次移動的磁道總是距離當前磁道最近的,在請求數多的情況下其磁頭移動軌跡看起來很像掃描法一直向另一端移動一樣,但實際上並不是,只是臨近的磁道數多,比較緊湊,隨着磁頭的移動,所在磁道數會離初始磁道數越來越遠,秉着尋道時間優先的前提,也就越來越向一端極化,從而表現得與掃描法相近。但這是由於磁道請求序列固定不變,當磁道請求序列為動態時SSTF會呈現高度局部化的傾向,而SCAN算法不一定。
觀察SCAN算法的磁頭移動軌跡,可以明顯發現,他從初始位置一直往外掃描,並掃描至盡頭后轉變方向向反方向掃描。
通過多次實驗研究可以發現,FCFS的移動的總磁道數遠遠高於其他兩種算法,SSTF的移動總磁道數略高於SCAN算法。實驗結果符合理論預期,FCFS基於先來先服務原則,經常可能出現磁頭在整個磁盤大幅度移動,導致每次磁道請求移動的磁道數大,進而導致整個請求完成時造成巨量的移動次數。SSTF基於尋道時間短的原則,他改善了磁盤服務,在此處靜態請求序列的情況下表現良好,但如處於操作系統的動態申請當中,就非常容易陷入高度局部化,導致另一端的請求長時間得不到服務。SCAN算法基於“電梯”原則,表現最佳,避免了SSTF中高度局部化的缺點,在磁道來回掃描,遇到所需的磁道時就進行服務,磁頭僅移到每個方向上有服務請求的最遠的道上。
磁道個數較多的輸出情況:




七、思考題
1、通過對每個算法進行時間復雜度分析對比,每個算法的效率如何?
FCFS算法直接從請求序列讀出數據,有多少個請求磁道就執行多少次,故時間復雜度為O(n)。
SSTF算法采用遞歸算法,一共遞歸N次,每次遞歸下的最大執行次數為N,故時間復雜度為O(n²)。
SCAN算法初始版本采用遞歸算法,一共遞歸N次,每次遞歸下同樣最大執行次數為N,故時間復雜度為O(n²)。快排版本時間復雜度由快排函數決定,時間復雜度為O(nlogn)。
FCFS算法的效率最高,但解決實際尋道問題的能力不足。SCAN算法的效率較好,在實現算法時我總是會花大量時間和資源在整個請求序列里去尋找下一次磁道移動的位置,實際上在真正的尋道過程中完全不需要手動去尋找下一次要移動到的磁道位置,只要磁頭往一個方向移動,遇到請求磁道就接受,只要感應到移動方向上還有待執行的請求序列即可。在靜態請求序列中,SSTF算法和SCAN算法的表現大致相同,但在實際磁盤尋道中是遠遠不一樣的,不能因為實驗結果中磁頭移動的軌跡大致相同就認為兩種算法差不多,SSTF算法效率最低,且容易陷入高度局部化中。
2、若所有硬盤全部設計成電子硬盤,哪個磁盤調度算法最合適?
電子硬盤不存在物理磁頭尋道操作,沒辦法使用磁頭,故使用FCFS先來先服務算法。
八、實驗數據及源代碼(學生必須提交自己設計的程序源代碼,並有注釋,源代碼電子版也一並提交),包括思考題的程序。
程序完整代碼請轉至個人GitHub倉庫(如果喜歡,麻煩點個star✨謝謝~)
結語:隨筆僅供參考,千萬不要照抄哦,我相信你可以的~!
