微吼云上線多路互動直播服務 加速多場景互動直播落地
1242
2022-05-28
操作系統之進程調度——優先權法和輪轉法(附上樣例講解)
操作系統之銀行家算法—詳解流程及案例數據
操作系統之多線程編程—讀者優先/寫者優先詳解
操作系統之存儲管理——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( ) { @Override public 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; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
輸出案例
測試數據:
若有錯誤的地方,還請大神指正。
如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。