操作系統實驗報告——磁盤調度算法

操作系統實驗報告——磁盤調度算法

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章