⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 磁盘调度.cpp

📁 操作系统磁盘调度算法
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
 void FCFS(int array[],int m)// 先来先服务算法
{    int j,i,now;
	 float sum = 0,avg;
     cout<<"输入当前的磁道号:";//输入当前磁道号
     cin>>now;
	 sum=abs(now-array[0]);
     cout<<"先来先服务算法(FCFS)调度后的序列为"<<array[0]<<" ";//输出磁盘调度序列
     for(i=0,j=1;j<m;i++,j++)
	 {
      sum=sum+abs(array[j]-array[i]);
	  cout<<array[j]<<" ";     //输出磁盘调度序列
	 }
     avg=sum/(m);
     cout<<endl<<"平均寻道长度:"<<avg<<endl;//输出平均寻道长度
}
//////////////////////////////////////////////////////
void SSTF(int array[],int m)// 最短寻道时间优先算法
{     int temp;
      int k=1;
      int now,l,r;
      int i,j;
	  float sum=0,avg=0;
      for(i=0;i<m;i++)
      for(j=i+1;j<m;j++)
	  {
        if(array[i]>array[j]) //将磁道号从小到大排序
		{
           temp=array[i];
           array[i]=array[j];
           array[j]=temp;
		}
	  } 
      cout<<"请输入当前的磁道号:"; //输入当前磁道号
      cin>>now;
	  cout<<"最短寻道时间优先算法(SSTF)调度后的序列为";//输出磁盘调度序列
      if(array[m-1]<=now)  //若被访问的下一最大的磁道号不大于当前的磁道号
	  {  
         for(i=m-1;i>=0;i--)
         { cout<<array[i]<<" ";//输出磁盘调度序列
		   sum=now-array[i]; 
		   now=array[i];
		 }
	  }
      else
	  {
		if(array[0]>=now)  //若被访问的下一最小的磁道号不小于当前的磁道号
		{  
          for(i=0;i<m;i++)
          {  cout<<array[i]<<" ";//输出磁盘调度序列
             sum=array[i]-now;
			 now=array[i];
		  }
		}
        else  //当前的磁道号的值在若所有被访问的下的磁道号之间
		{
           while(array[k]<now) //确定当前磁道在已排的序列中的位置
		   {  k++;	}
           l=k-1;
           r=k;
		   if((now-array[l])<=(array[r]-now)) 
		   {
			  while(l>=0)    //先向磁道号减小方向访问
			  {
				cout<<array[l]<<" "; //输出磁盘调度序列
                sum=sum+now-array[l];
                now=array[l];
                l=l-1;
			  }
			  now=array[0];
			  for(j=r;j<m;j++)  //再向磁道号增加方向访问
			  {  cout<<array[j]<<" "; //输出磁盘调度序列
			     sum+=array[j]-now;
		    	 now=array[j];
			  }
		   }
		   else   //先向磁道号增加方向访问
		   {
			  while(r<m)
              {
                 cout<<array[r]<<" ";//输出磁盘调度序列
                 sum+=array[r]-now;
                 now=array[r];
                 r=r+1;
			  }
			  now=array[m-1]; 
			  for(j=l;j>=0;j--)  //再向磁道号减小方向访问
			  {  cout<<array[j]<<" ";  //输出磁盘调度序列
			     sum+=now-array[j];
		    	 now=array[j];
			  }
		   } 
		}
	  }
    avg=sum/(m);
    cout<<endl<<"平均寻道长度:"<<avg<<endl;//输出平均寻道长度
}
///////////////////////////////////////////////////////
void SCAN(int array[],int m)  //扫描算法
{     int temp;
      int k=1;
      int now,d,l,r;
      int i,j;
	  float sum=0,avg=0;
      for(i=0;i<m;i++)
      for(j=i+1;j<m;j++)
	  {
        if(array[i]>array[j]) //将磁道号从小到大排序
		{
           temp=array[i];
           array[i]=array[j];
           array[j]=temp;
		}
	  } 
      cout<<"请输入当前的磁道号:";//输入当前磁道号
      cin>>now;
	  cout<<"请输入当前移动臂的移动的方向(1 表示向磁道号增加方向,0 表示向磁道号减小方向): ";
      cin>>d;       //先要给出当前磁道号和移动臂的移动方向
	  cout<<"扫描算法(SCAN)调度后的序列为";
      if(array[m-1]<=now)   //若被访问的下一最大的磁道号不大于当前的磁道号
	  {  
         for(i=m-1;i>=0;i--)
         { cout<<array[i]<<" "; //输出磁盘调度序列
		   sum=now-array[i]; 
		   now=array[i];
		 }
	  }
      else   
	  {
		if(array[0]>=now) //若被访问的下一最小的磁道号不小于当前的磁道号
		{  
          for(i=0;i<m;i++)
          {  cout<<array[i]<<" "; //输出磁盘调度序列
             sum=array[i]-now;
			 now=array[i];
		  }
		}
        else  //当前的磁道号的值在若所有被访问的下的磁道号之间
		{
           while(array[k]<now)  //确定当前磁道在已排的序列中的位置
		   {  k++;	}
           l=k-1;
           r=k;
		   switch(d)
		   {
		   case 0:       //先向磁道号减小方向访问
			 {
			   while(l>=0)
			   {
			  	cout<<array[l]<<" "; //输出磁盘调度序列
                sum=sum+now-array[l];
                now=array[l];
                l=l-1;
			   }
			   now=array[0];
			   for(j=r;j<m;j++)
			   {  cout<<array[j]<<" "; //输出磁盘调度序列
			     sum+=array[j]-now;
		    	 now=array[j];
			   } break;
			 }
		   case 1:   //先向磁道号增加方向访问
		   {
			  while(r<m)
              {
                 cout<<array[r]<<" ";//输出磁盘调度序列
                 sum+=array[r]-now;
                 now=array[r];
                 r=r+1;
			  }
			  now=array[m-1];
			  for(j=l;j>=0;j--)
			  {  cout<<array[j]<<" ";  //输出磁盘调度序列
			     sum+=now-array[j];
		    	 now=array[j];
			  }break;
		   } 
		   default: cout<<"输入有误"<<endl;
		   }
		}
	  }
    avg=sum/(m);
    cout<<endl<<"平均寻道长度:"<<avg<<endl;//输出平均寻道长度
}
///////////////////////////////////////////////////////
void main()
{  
     int i,m,n,flag=1,array[100];	 
     cout<<"输入磁盘调度序列的个数:"; 
	 cin>>m;
     cout<<"分别输入磁盘调度序列:";
	 for(i=0;i<m;i++)
	 {  cin>>array[i];  }
	 do
	 { 
	    cout<<"0 终止"<<endl;
	    cout<<"1 先来先服务算法(FCFS)"<<endl;
	    cout<<"2 最短寻道时间优先算法(SSTF)"<<endl;
	    cout<<"3 最短寻道时间优先算法(SCAN)"<<endl;
        cout<<"选择以上的算法:";
		cin>>n;
	    switch(n)
		{
		   case 0: { flag=0;  break; } //终止程序
		   case 1:
			 {  FCFS(array,m); break; } //先来先服务算法(FCFS)
		   case 2:
			{  SSTF(array,m); break; }//最短寻道时间优先算法(SSTF)
           case 3:
			{  SCAN(array,m); break; }//最短寻道时间优先算法(SCAN)
		   default: cout<<"输入有误,请重新输入:"<<endl;
		}
	 }while(flag!=0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -