日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统之磁盘调度——SCAN实例讲解

發布時間:2025/3/20 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统之磁盘调度——SCAN实例讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

操作系統之進程調度——優先權法和輪轉法(附上樣例講解)
操作系統之銀行家算法—詳解流程及案例數據
操作系統之多線程編程—讀者優先/寫者優先詳解
操作系統之存儲管理——FIFO算法和LRU算法
操作系統之磁盤調度——SCAN實例講解

要求

一、實驗目的:
磁盤是高速、大容量、旋轉型、可直接存取的存儲設備。它作為計算機系統的輔助存儲器,擔負著繁重的輸入輸出工作,在現代計算機系統中往往同時會有若干個要求訪問磁盤的輸入輸出要求。系統可采用一種策略,盡可能按最佳次序執行訪問磁盤的請求。由于磁盤訪問時間主要受尋道時間T的影響,為此需要采用合適的尋道算法,以降低尋道時間。本實驗要求學生模擬設計一個磁盤調度程序,觀察調度程序的動態運行過程。通過實驗讓學生理解和掌握磁盤調度的職能。
二、實驗內容:
模擬電梯調度算法,對磁盤進行移臂操作
三、提示及要求:
1、假設磁盤只有一個盤面,并且磁盤是可移動頭磁盤。
2、磁盤是可供多個進程共享的存儲設備,但一個磁盤每個時刻只能為一個進程服務。當有進程在訪問某個磁盤時,其它想訪問該磁盤的進程必須等待,直到磁盤一次工作結束。當有多個進程提出輸入輸出請求而處于等待狀態時,可用電梯調度算法從若干個等待訪問者中選擇一個進程,讓它訪問磁盤。為此設置“驅動調度”進程。
3、由于磁盤與處理器是并行工作的,所以當磁盤在為一個進程服務時,占有處理器的其它進程可以提出使用磁盤(這里我們只要求訪問磁道),即動態申請訪問磁道,為此設置“接受請求”進程。
4、為了模擬以上兩個進程的執行,可以考慮使用隨機數來確定二者的允許順序,程序結構圖參考附圖:
5、“接受請求”進程建立一張“進程請求I/O”表,指出等待訪問磁盤的進程要求訪問的磁道,表的格式如下:
| 進程名 | 要訪問的磁道 |
|進程id| 磁道號:|
6、 “磁盤調度”的功能是查“請求I/O”表,當有等待訪問的進程時,按電梯調度算法(SCAN算法)從中選擇一個等待訪問的進程,按其指定的要求訪問磁道。SCAN算法參考課本第九章。算法模擬框圖略。
7、附圖中的“初始化”工作包括:初始化“請求I/O”表,設置置當前移臂方向;當前磁道號。并且假設程序運行前“請求I/O”表中已有若干進程(4~8個)申請訪問相應磁道。
四、實驗報告:
1、實驗題目。
2、程序中用到的數據結構及其說明。
3、打印源程序并附注釋。
4、實驗結果內容如下:打印“請求I/O”表,當前磁道號,移臂方向,被選中的進程名和其要求訪問的磁道,看是否體現了電梯調度(SCAN)算法。體會與問題。
五、 附圖:

理解

上面就是實驗要求。
本實驗的核心就是對SCAN算法的理解,SCAN被稱為梯度算法。因為它不僅兼顧距離的遠近還兼顧方向性。
Scan算法思想大致為:

  • 當設備無訪問請求時,磁頭不動;
  • 當有訪問請求時,磁頭按一個方向移動,在移 [2] 動過程中對遇到的訪問請求進行服務,然后判斷該方向上是否還有訪問請求,如果有則繼續掃描;否則改變移動方向,并為經過的訪問請求服務,如此反復。
  • 如下圖所示:

代碼

這大致就是流程,當然,你可以動態的增加io請求(接受請求)。
附上代碼:

import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Scanner;public class 磁盤調度 {private static void getstatus(Listlist) {// TODO 自動生成的方法存根System.out.println("進程id: 磁道: 是否調度?:");for(int i=0;i list, int index, int cidao) {if(index==1)//向左面{int mid=0;for(int i=0;i<=list.size();i ){if(list.get(i).cidao>cidao&&list.get(i).isdiaodu==false){mid=i-1;break;}}while(mid>=0){if(list.get(mid).isdiaodu==false){io io=list.get(mid);io.isdiaodu=true;System.out.println("進程" io.id " 磁道:" io.cidao " 已經調度"); }mid--;}mid ;while(midcidao&&list.get(i).isdiaodu==false){mid=i;break;}}while(mid=0){if(list.get(mid).isdiaodu==false){io io=list.get(mid);io.isdiaodu=true;System.out.println("進程" io.id " 磁道:" io.cidao " 已經調度"); }mid--;}}}public static void main(String[] args) {// TODO 自動生成的方法存根Scanner sc=new Scanner(System.in);System.out.println("請輸入訪問磁盤的進程數量");int n=sc.nextInt();System.out.println("請輸入訪問進程的id和磁道號");Listlist=new ArrayList<>();for(int i=0;icompare=new Comparator() {@Overridepublic int compare(io o1, io o2) {// TODO 自動生成的方法存根return o1.cidao-o2.cidao;}};static class io{int id;int cidao;boolean isdiaodu;public io(int id,int cidao){this.id=id;this.cidao=cidao;}} }

輸出案例

測試數據:


若有錯誤的地方,還請大神指正。

如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai

總結

以上是生活随笔為你收集整理的操作系统之磁盘调度——SCAN实例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。