操作系统实验报告——磁盘调度算法

操作系统实验报告——磁盘调度算法

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