操作系統實驗報告——磁盤調度算法
1、實驗名稱: 磁盤調度算法的實現
2、實驗要求:
(1)理解磁盤調度的概念,
(2)掌握磁盤調度程序的三種算法;
(3)用C或C++語言編程實現算法。
3、實驗方式: 通過上機,調試運行程序。
4、實驗環境:
(1)硬件環境:
(2)軟件環境:Windows 10操作系統,C或C++程序設計語言。
5、實驗過程:
(1)實驗描述:
共享設備的典型代表爲磁盤,磁盤物理塊的地址由柱面號、磁頭號、扇區號來指定,完成磁盤某一個物理塊的訪問要經過三個階段:尋道時間Ts、旋轉延遲時間Tw和讀寫時間Trw。
尋道時間Ts是磁頭從當前磁道移動到目標磁道所需要的時間;旋轉延遲時間Tw是當磁頭停留在目標磁道後,目標物理塊從當前位置旋轉到磁頭位置的時間;讀寫時間Trw是目標物理塊內容與內存中對應交換的時間。磁盤調度的原則是公平和高吞吐量,衡量指標有訪問時間T和平均訪問時間Ta:
T=Ts+Tw+Trw
Ta=Tsa+Twa+Trwa
尋道時間和旋轉延遲時間成爲調度算法的主要考慮因素。減少訪問時間就是要減少尋道時間和旋轉延遲時間。
FCFS算法:根據進程請求訪問磁盤的先後次序進行調度;
SSTF算法:要求訪問的磁道與當前磁頭所在的磁道距離最近,以便每次的尋道時間最短;
SCAN算法:不僅考慮了欲訪問的磁道與當前磁道間的距離,更優先考慮的是磁頭當前的移動方向。
(2)源代碼:
#include<stdio.h>
int num,sum,kai,max;
int m=0;
int n=0;
int s[100];
int s1[100];
int c1[50];
int c2[50];
void creat(){
printf("請輸入從哪個磁道開始:");
scanf("%d",&kai);
printf("請輸入最長磁道號:");
scanf("%d",&max);
printf("請輸入磁道的個數:");
scanf("%d",&num);
for(int j=0;j<num;j++){
printf("請輸入第%d個磁道:",j+1);
scanf("%d",&s[j]);
if(s[j]>max) {
printf("ERROR\n");
break;
}
for(int i=0;i<j;i++)
if(s[j]==s[i])
j--;
}
printf("被訪問的下一個磁道\n");
for(int i=0;i<num;i++){
printf("\t%d\t\n",s[i]);
}
int su=kai;
int t;
for(int i=0;i<num;i++)
if(su>s[i])
c1[m++]=s[i];
else
c2[n++]=s[i];
for(int i=0;i<m;i++)
for(int j=i;j<m;j++)
if(c1[i]<c1[j])
{t=c1[i];c1[i]=c1[j];c1[j]=t;}
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(c2[i]>c2[j])
{t=c2[i];c2[i]=c2[j];c2[j]=t;}
}
void FCFS(){
printf("先來先服務 FCFS:\n");
printf("被訪問的下一個磁道\t\t\t磁道號移動距離:\n");
int su=kai;
sum=0;
for(int i=0;i<num;i++){
if(su<s[i])
s1[i]=s[i]-su;
else
s1[i]=su-s[i];
su=s[i];
sum+=s1[i];
}
for(int i=0;i<num;i++){
printf("\t%d\t\t\t\t\t%d\t\t\n",s[i],s1[i]);
}
printf("尋道長度:%d\n",sum);
}
void SSTF(){
printf("最短尋道 SSTF:\n");
printf("被訪問的下一個磁道\t\t\t磁道號移動距離\n");
int su=kai;
int s2[100];
sum=0;
for(int i=0;i<m;i++)
s2[i]=c1[i];
for(int i=0;i<n;i++)
s2[i+m]=c2[i];
for(int i=0;i<num;i++){
if(su<s2[i])
s1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
for(int i=0;i<num;i++){
printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);
}
printf("尋道長度:%d\n",sum);
}
void SCAN(){
printf("掃描算法 SCAN:\n");
printf("被訪問的下一個磁道:\t\t\t磁道號移動距離:\n");
int su=kai;
int s2[100];
sum=0;
for(int i=0;i<n;i++)
s2[i]=c2[i];
for(int i=0;i<m;i++)
s2[i+n]=c1[i];
for(int i=0;i<num;i++){
if(su<s2[i])
s1[i]=s2[i]-su;
else
s1[i]=su-s2[i];
su=s2[i];
sum+=s1[i];
}
for(int i=0;i<num;i++){
printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);
}
printf("尋道長度:%d\n",sum);
}
void MENU(){
printf("磁盤調度\n");
printf("------------------------------------------\n");
printf(" 1.創建磁道\n");
printf(" 2.先來先服務 FCFS\n");
printf(" 3.最短尋道 SSTF\n");
printf(" 4.掃描算法 SCAN\n");
printf(" 5.退出 EXIT\n");
printf("------------------------------------------\n");
int menuchoice;
scanf("%d",&menuchoice);
if(menuchoice!=1&&menuchoice!=6){
printf("請先創建磁道\n");
}
if(menuchoice==6){
printf("謝謝使用!");
}
else{
creat();
printf("磁盤調度\n");
P:printf("------------------------------------------\n");
printf(" 1.創建磁道\n");
printf(" 2.先來先服務 FCFS\n");
printf(" 3.最短尋道 SSTF\n");
printf(" 4.掃描算法 SCAN\n");
printf(" 5.退出 EXIT\n");
printf("------------------------------------------\n");
scanf("%d",&menuchoice);
if(menuchoice>6||menuchoice<1){
printf("沒看到菜單隻有1-5嗎?搞事情啊!!!\n");
goto P;
}
switch(menuchoice){
case 2:
FCFS();
goto P;
case 3:
SSTF();
goto P;
case 4:
SCAN();
goto P;
case 5:
printf("謝謝使用!");
break;
}
}
}
int main(){
MENU();
return 0;
}