磁盘调度
#include "stdio.h"
#include "stdlib.h"
void CopyL(int Sour[],int Dist[] ,int x); //数组 Sour 复制到数组 Dist,复制到
x 个数
void SetDI(int DiscL[]); //随机生成磁道数
void Print(int Pri[],int x); //打印输出数组 Pri
void DelInq(int Sour[],int x,int y); //数组 Sour 把 x 位置的数删除,并把 y 前
面的数向前移动,y 后的数保持不变(即会出现 2 个 y)
void FCFS(int Han,int DiscL[]); //先来先服务算法(FCFS)
void SSTF(int Han,int DiscL[]); //最短寻道时间优先算法(SSTF)
int SCAN(int Han,int DiscL[],int x,int y); //扫描算法(SCAN)
void CSCAN(int Han,int DiscL[]); //循环扫描算法(CSCAN)
void N_Step_SCAN(int Han1,int DiscL[]); //N 步扫描算法(NStepScan)
void PaiXu(); //寻道长度由低到高排序
void Pri();
int NAll=0;
int Best[5][2]; //用作寻道长度由低到高排序时存放的数组
int Limit=0; //输入寻找的范围磁道数 i
int Jage;
float Aver=0;
int main()
{
int i;
int DiscLine[10]; //声明准备要生成的随机磁道号的数组
int Hand; //磁道数
int Con=1;
int n;
while(Con==1)
{
Jage=0;
printf("\n 请输入初始的磁道数(065536){
printf("超出范围!");
}
else{
操作系统课程设计
printf("
printf("
磁盘调度算法
║
║
╰═══════════════╯
1.先来先服务算法(FCFS)
╭═══════════════╮
║
printf(" ╭═════┤
printf(" ║
printf(" ║
printf("
║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
printf(" ║
4.循环扫描算法(CSCAN)
3.扫描算法(SCAN)
6.各类算法的比较
5.N 步扫描算法(NStepScan)
2.最短寻道时间优先算法(SSTF)
║\n");
\n");
║ \n");
├═════╮\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
║\n");
printf(" ║
printf(" ║
printf(" ║ ╭───────────────────────╮ ║\n");
printf(" ╰═┤
请输入你的选择的算法(输入 0 离开)
║\n");
║\n");
├═╯\n");
printf("
╰───────────────────────╯\n");
scanf("%d",&n);
if(n==0) exit(0);
printf("\n");
switch(n)
{
case 1:
SetDI(DiscLine); //随机生成磁道数
FCFS(Hand,DiscLine); //先来先服务算法(FCFS)
break;
case 2:
SetDI(DiscLine); //随机生成磁道数
SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)
break;
case 3:
SetDI(DiscLine); //随机生成磁道数
SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)
break;
case 4:
SetDI(DiscLine); //随机生成磁道数
CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN)
break;
case 5:
SetDI(DiscLine); //随机生成磁道数
N_Step_SCAN(Hand,DiscLine); //N 步扫描算法(NStepScan)
break;
case 6:
SetDI(DiscLine); //随机生成磁道数
FCFS(Hand,DiscLine); //先来先服务算法(FCFS)
SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)
SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)
CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN)
N_Step_SCAN(Hand,DiscLine); //N 步扫描算法(NStepScan)
PaiXu(); //寻道长度由低到高排序
printf("\n\n+ 寻道长度由低到高排序:");
for(i=0;i<5;i++)
{
printf("%4d ",Best[i][0]);
}
break;
}
printf("\n\n+ 是否继续(按 0 结束,按 1 继续)?");
scanf("%5d",&Con);
}
}
}
//数组 Sour 复制到数组 Dist,复制到 x 个数
void CopyL(int Sour[],int Dist[] ,int x)
{
int i;
for(i=0;i<=x;i++)
{
Dist[i]=Sour[i];
}
}
//打印输出数组 Pri
void Print(int Pri[],int x)
{
int i;
for(i=0;i<=x;i++)
{
printf("%5d",Pri[i]);
}
}
//随机生成磁道数
void SetDI(int DiscL[])
{
int i;
for(i=0;i<=9;i++)
{
DiscL[i]=rand()%Limit;//随机生成 10 个磁道号
}
printf("+ 需要寻找的磁道号:");
Print(DiscL,9); //输出随机生成的磁道号
printf("\n");
}
//数组 Sour 把 x 位置的数删除,并把 y 前面的数向前移动,y 后的数保持不变(即
会出现 2 个 y)
void DelInq(int Sour[],int x,int y)
{
int i;
for(i=x;i
for(i=0;i<=9;i++)
{
Temp=RLine[0]-RLine[1];//求出移动磁道数,前一个磁道数减去后一个磁道数
得出临时的移动距离
if(Temp<0)
Temp=(-Temp);//移动磁道数为负数时,算出相反数作为移动磁道数
printf("%5d",RLine[0]);
All=Temp+All;//求全部磁道数的总和
DelInq(RLine,0,k);//每个磁道数向前移动一位
k--;
}
Best[Jage][1]=All;//Best[][1]存放移动磁道数
Best[Jage][0]=1; //Best[][0]存放算法的序号为:1
Jage++;//排序的序号加 1
Aver=((float) All)/10;//求平均寻道次数
printf("\n+ 移动磁道数:<%5d> ",All);
printf("\n+ 平均寻道长度:*%0.2f* ",Aver);
}
//最短寻道时间优先算法(SSTF)
void SSTF(int Han,int DiscL[])
{
int i,j,k,h,All;
int Temp; //Temp 是计算移动的磁道距离的临时变量
int RLine[10];
int Min;
All=0; //统计全部的磁道数变量
k=9; //限定 10 个的磁道数
CopyL(DiscL,RLine,9); //复制磁道号到临时数组 RLine
//将随机生成的磁道数数组 Discl[]复制给数组 RLine[]
printf("\n+ 按照 SSTF 算法磁道的访问顺序为:");
for(i=0;i<=9;i++)
{
Min=64000;
for(j=0;j<=k;j++) //内循环寻找与当前磁道号最短寻道的时间的磁道号
{
if(RLine[j]>Han) //如果第一个随机生成的磁道号大于当前的磁道号,执行下
一句
Temp=RLine[j]-Han; //求出临时的移动距离
else
Temp=Han-RLine[j]; //求出临时的移动距离
if(Temp ",All);
printf("\n+ 平均寻道长度:*%0.2f* ",Aver);
}
//扫描算法(SCAN)
int SCAN(int Han,int DiscL[],int x,int y)
{
int j,n,k,h,m,All;
int t=0;
int Temp;
int Min;
int RLine[10]; //将随机生成的磁道数数组 Discl[]复制给数组 RLine[]
int Order;
Order=1;
k=y;
m=2; //控制 while 语句的执行,即是一定要使当前磁道向内向外都要扫描到
All=0; //统计全部的磁道数变量
CopyL(DiscL,RLine,9); //复制磁道号到临时数组 RLine
printf("\n+ 按照 SCAN 算法磁道的访问顺序为:");
Min=64000;
for(j=x;j<=y;j++) //寻找与当前磁道号最短寻道的时间的磁道号
{
if(RLine[j]>Han) //如果第一个随机生成的磁道号大于当前的磁道号,执行下
一句
Temp=RLine[j]-Han; //求出临时的移动距离
else
Temp=Han-RLine[j]; //求出临时的移动距离
if(Temp=Han){ //判断磁道的移动方向,即是由里向外还是由外向里
Order=0;
t=1;
}
Han=RLine[h];
DelInq(RLine,h,k); //每个磁道数向前移动一位
k--;