【專案】模擬實現磁碟排程演算法--掃描演算法
阿新 • • 發佈:2018-12-26
報告的內容、目的及原理
一、實驗內容
模擬電梯排程演算法,實現對磁碟的驅動排程。
二、實驗目的
磁碟是一種高速、大量旋轉型、可直接存取的儲存裝置。它作為計算機系統的輔助儲存器,負擔著繁重的輸入輸出任務,在多道程式設計系統中,往往同時會有若干個要求訪問磁碟的輸入輸出請示等待處理。系統可採用一種策略,儘可能按最佳次序執行要求訪問磁碟的諸輸入輸出請求,這就叫驅動排程,使用的演算法稱驅動排程演算法。驅動排程能降低為若干個輸入輸出請求服務所須的總時間,從而提高系統效率。本實驗要求學生模擬設計一個驅動排程程式,觀察驅動排程程式的動態執行過程。
三、實驗原理
磁碟是要供多個程序共享的儲存裝置,但一個磁碟每個時刻只能為一個程序服務。
當有程序在訪問某個磁碟時,其他想訪問該磁碟的程序必須等待,直到磁碟一次工作結束。
當有多個程序提出輸入輸出請求處於等待狀態,可用電梯排程演算法從若干個等待訪問者中選擇一個程序,讓它訪問磁碟。當存取臂僅需移到一個方向最遠的所請求的柱面後,如果沒有訪問請求了,存取臂就改變方向。
具體題目要求
假設磁碟有200個磁軌,用C語言隨機函式隨機生成一個磁軌請求序列(不少於15個)放入模擬的磁碟請求佇列中,假定當前磁頭在100號磁軌上,並向磁軌號增加的方向上移動。請給出按電梯排程演算法進行磁碟排程時滿足請求的次序,並計算出它們的平均尋道長度。
思路
僅僅用到陣列,加上取隨機數就可以完成的
程式碼實現
//模擬實現掃描演算法 #include<stdio.h> #include<stdlib.h> #include<time.h> void time_random(int *t)//定義取時間隨機數 { int i,number=0; srand((unsigned) time(NULL)); //用時間做種,每次產生隨機數不一樣,但還是可能會相同 for (i=0; i<20; i++)//取三十個隨機數,放入陣列t中 { number = rand() % 201;//對21取餘 while(number==0)//若餘數為0,則一直取到不為0為止 number = rand() % 21; //產生1-20的隨機數 t[i]=number; //將隨機數賦給陣列 } } void Print(int *a)//列印陣列函式 { for(int i=0;a[i]!='\0';i++)//列印每一次排序的結果 printf("%d ",a[i]); printf("\n");//輸個換行符 } void Insert(int *a)//插入排序 { int j;int k; int temp = 0; for(int i=1;a[i]!='\0';i++)//假設第一個元素已經是有序佇列 { for(j=0;j<i&&a[j]<a[i];) j++; if(i!=j) { temp = a[i]; for(k = i-1;k>=j;k--) a[k+1]=a[k]; a[j] = temp; } } } void change(int *a,int *b) { int i,j = 0; for(i = 1;j<15;i++) { if(a[i]!=a[i-1]) { b[j]=a[i-1]; j++; } } b[15]='\0'; } void run(int *x) { int loc ; int avglength; for(loc = 0;loc<15&&x[loc]<100;loc++) ;//空語句,只為 loc++ avglength = x[14]*2-x[0]-100; avglength /=15; for(int j = loc;j<15;j++) { printf("\n%3d訪問",x[j]); x[j] = '0'; } for(int j = loc-1;j>=0;j--) { printf("\n%3d訪問",x[j]); x[j] = '0'; } printf("\n\n平均尋道長度:%d",avglength); } int main() { int t[21]={0}; int tx[16]; time_random(t); Insert(t); printf("磁頭在100號磁軌上,並向磁軌號增加的方向上移動\n"); printf("\n15個程序訪問磁碟:\n"); change(t,tx); Print(tx); //開始執行 run(tx); return 0; }
什麼是磁碟排程?具體請看連結
----------->>>>>>磁碟排程演算法