📄 disk.cpp
字号:
}
while(p!=NULL&&p->flag!=0)
p=p->next;
while(p!=NULL&&p->flag==0&&i<100)//无请求回到这里
{
if(i==0||endflag2==1)//计算每一次读取相对于前一次读取的位移
{
dist=p->number;
endflag2=0;
}
else //计算每一次读取相对于前一次读取的位移
dist=abs(p->number-prev->number);
sum=sum+dist;
cout<<"磁头正在读取:"<<p->number<<"磁道,相对位移是:"<<dist<<endl;
fputs("磁头正在读取:",fp);
fprintf(fp,"%-5d",p->number);
fputs("磁道,相对位移是:",fp);
fprintf(fp,"%d\n",dist);
p->flag=1;
temp=prev=p;
i++;
if(j<100){
g_num=generate(f,t,array);
if(g_num==0)//无请求
{
cout<<"磁盘向内圈方向没有新的访问请求!\n";
fputs("磁盘向内圈方向没有新的访问请求!\n",fp);
p=p->next;
if(p==NULL)
{ //endflag=1;
break;}
}
else//有请求
{
cout<<"磁盘向内圈方向有新请求!\n";
fputs("磁盘向内圈方向有新请求!\n",fp);
break;
}
}
else p=p->next;
}//.................................................while(p!=NULL&&p->flag==0&&i<100)
//累计从最远访问磁道到第1500磁道的访问道数
}//......................................................if(endflag==0)
if(p==NULL&&endflag==0)
{
g_num=generate(f,t,array);
if(g_num==0)
{
endflag=1;
max_end=max_end+(1500-temp->number);
cout<<"!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第1500磁道!!!!!!!!!!!!!!!!!!!!!!!\n";
fputs("!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第1500磁道!!!!!!!!!!!!!!!!!!!!!!!\n",fp);
}
else
continue;
}
if(endflag==1)//磁头从1500向0方向移动
{
p0=(struct Lnode*)malloc (sizeof(struct Lnode));
p0=temp;
while(p0!=headnode&&p0->flag!=0)//有无被访问过
{
p0=p0->prior;
if(p0->flag==0)
{
pf=1;
break;
}
}
if(pf==1)//还有未被访问过的
{
while(p0!=headnode&&p0->flag!=0)
p0=p0->prior;
while(p0!=headnode&&p0->flag==0&&i<100)
{
dist=abs(p0->number-prev->number);//计算每一次读取相对于前一次读取的位移
sum=sum+dist;
cout<<"磁头正在读取:"<<p0->number<<"磁道,"<<i<<"相对位移是:"<<dist<<endl;
fputs("磁头正在读取:",fp);
fprintf(fp,"%-5d",p0->number);
fputs("磁道,相对位移是:",fp);
fprintf(fp,"%d\n",dist);
p0->flag=1;
temp=prev=p0;
i++;
if(j<100)
{
g_num=generate(f,t,array);
if(g_num==0)
{
cout<<"磁盘磁盘向外圈方向没有新请求!\n";
fputs("磁盘磁盘向外圈方向没有新请求!\n",fp);
p0=p0->prior;
}
else
{
cout<<"磁盘向外圈方向有新请求!\n";
fputs("磁盘向外圈方向有新请求!\n",fp);
break;
}
}
else p0=p0->prior;
}
if(p0==headnode&&endflag==1)
{
g_num=generate(f,t,array);
if(g_num==0)
{
endflag=0;
endflag2=1;
cout<<"!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第0磁道!!!!!!!!!!!!!!!!!!!!!!!\n";
fputs("!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第0磁道!!!!!!!!!!!!!!!!!!!!!!!\n",fp);
}
else
continue;
}
}//.............................................if(pf==1)
else if(pf==0)//没有未访问的
{
g_num=generate(f,t,array);
while(g_num==0)
g_num=generate(f,t,array);
continue;
}
}//.....................................................if(endflag==1)
cnt=cnt+g_num;//累计已产生随机数数量,以下语句控制数量不超过100
if(cnt>90&&cnt<100)
{
t=100-cnt;
f=1;
}
}//..........................................................while(i<100)
if(i==100)
{
cout<<"磁头移动道数为:"<<sum<<"+"<<max_end<<"+"<<min_end<<"="<<sum+max_end+min_end<<endl;
fputs("磁头移动道数为:",fp);
fprintf(fp,"%d+%d+%d=%d\n",sum,max_end,min_end,sum+max_end+min_end);
fputs("\n\n\n",fp);
}
return sum+max_end+min_end;
}
int CSCAN()//.....................................................................CSCAN算法
{
int cnt=0,g_num,dist;int sum=0,max_end=0,prev_number;
int f=0,f0=0,t=0,fg=0,j=0,i=0; int pf=0,endflag=0,pnullf=0;
int array[10];
linklist headnode,p,p0,temp,prev;
FILE *fp;
fp=fopen("look.txt","a");
headnode=(struct Lnode*)malloc (sizeof(struct Lnode));
headnode->flag=headnode->number=0;
headnode->next=NULL;
headnode->prior=NULL;
g_num=generate(f,t,array);
while(g_num==0)//产生随机数,直到有
{
if(g_num==0)
cout<<"磁头位于第0磁道,磁盘没有访问请求!"<<endl;
fputs("磁头位于第0磁道,磁盘没有访问请求!\n",fp);
g_num=generate(f,t,array);//g_num不为0则array有数据
}
cnt=g_num;
while(i<100)
{
Track_list(headnode,array,g_num,j);//有请求回到这里
p=(struct Lnode*)malloc (sizeof(struct Lnode));
if(i==0||endflag==1)p=headnode->next;
else p=temp->next;
while(p!=NULL&&p->flag!=0)
p=p->next;
if(p==NULL&&j<100)//上一次打印到表末了
{
g_num=generate(f,t,array);
while(g_num==0)
g_num=generate(f,t,array);
continue;
}
while(p!=NULL&&p->flag==0&&i<100)//无请求回到这里
{
if(i==0)
dist=p->number;//计算每一次读取相对于前一次读取的位移
else
dist=abs(p->number-prev_number);//计算每一次读取相对于前一次读取的位移
sum=sum+dist;
cout<<"磁头正在读取:"<<p->number<<"磁道,相对位移是:"<<dist<<endl;
fputs("磁头正在读取:",fp);
fprintf(fp,"%-5d",p->number);
fputs("磁道,相对位移是:",fp);
fprintf(fp,"%d\n",dist);
p->flag=1;
temp=prev=p;
prev_number=prev->number;
i++;
if(j<100)
{
g_num=generate(f,t,array);
if(g_num==0)//无请求
{
cout<<"磁盘没有新的访问请求!\n";
fputs("磁盘没有新的访问请求!\n",fp);
p=p->next;
if(p==NULL)//无请求且到达到数量
{ //endflag=1;
break;
}
}
else//有请求
{
cout<<"磁盘有新请求!\n";
fputs("磁盘有新请求!\n",fp);
break;
}
}
else p=p->next;
}//................................................while(p!=NULL&&p->flag==0&&i<100)
if(p==NULL&&endflag==0)
{
g_num=generate(f,t,array);
if(g_num==0)
{
endflag=1;
prev_number=0;
max_end=max_end+(1500-temp->number);
cout<<"!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第1500磁道!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
fputs("!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第1500磁道!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",fp);
continue;
}
else
continue;
}
cnt=cnt+g_num;//累计已产生随机数数量,以下语句控制数量不超过100
if(cnt>90&&cnt<100)
{t=100-cnt;f=1;}
}//............................................ while(i<100)
if(i==100)
{
cout<<"磁头移动道数为:"<<sum<<"+"<<max_end<<"="<<sum+max_end<<endl;
fputs("磁头移动道数为:",fp);
fprintf(fp,"%d+%d=%d\n",sum,max_end,sum+max_end);
fputs("\n\n\n",fp);
}
return sum;
}
int LOOK()//.....................................................................LOOK算法
{
int cnt=0,g_num,dist;int sum=0,prev_number;
int f=0,f0=0,t=0,fg=0,j=0,i=0; int pf=0,endflag=0,pnullf=0;
int array[10];
linklist headnode,p,p0,temp,prev;
FILE *fp;
fp=fopen("look.txt","a");
headnode=(struct Lnode*)malloc (sizeof(struct Lnode));
headnode->flag=headnode->number=0;
headnode->next=NULL;
headnode->prior=NULL;
g_num=generate(f,t,array);
while(g_num==0)//产生随机数,直到有
{
if(g_num==0)
cout<<"磁头位于第0磁道,磁盘没有访问请求!"<<endl;
fputs("磁头位于第0磁道,磁盘没有访问请求!\n",fp);
g_num=generate(f,t,array);//g_num不为0则array有数据
}
cnt=g_num;
while(i<100)
{
Track_list(headnode,array,g_num,j);//有请求回到这里
p=(struct Lnode*)malloc (sizeof(struct Lnode));
if(i==0||endflag==1)p=headnode->next;
else p=temp->next;
while(p!=NULL&&p->flag!=0)
p=p->next;
if(p==NULL&&j<100)//上一次打印到表末了
{
g_num=generate(f,t,array);
while(g_num==0)
g_num=generate(f,t,array);
continue;
}
while(p!=NULL&&p->flag==0&&i<100)//无请求回到这里
{
if(i==0)
dist=p->number;//计算每一次读取相对于前一次读取的位移
else
dist=abs(p->number-prev_number);//计算每一次读取相对于前一次读取的位移
sum=sum+dist;
cout<<"磁头正在读取:"<<p->number<<"磁道,相对位移是:"<<dist<<endl;
fputs("磁头正在读取:",fp);
fprintf(fp,"%-5d",p->number);
fputs("磁道,相对位移是:",fp);
fprintf(fp,"%d\n",dist);
p->flag=1;
temp=prev=p;
prev_number=prev->number;
i++;
if(j<100)
{
g_num=generate(f,t,array);
if(g_num==0)//无请求
{
cout<<"磁盘没有新的访问请求!\n";
fputs("磁盘没有新的访问请求!\n",fp);
p=p->next;
if(p==NULL)//无请求且到达到数量
{ //endflag=1;
break;}
}
else//有请求
{
cout<<"磁盘有新请求!\n";
fputs("磁盘有新请求!\n",fp);
break;
}
}
else p=p->next;
}//................................................while(p!=NULL&&p->flag==0&&i<100)
if(p==NULL&&endflag==0)
{
g_num=generate(f,t,array);
if(g_num==0)
{
endflag=1;
cout<<"!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第1500磁道!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
fputs("!!!!!!!!!!!!!!!!!!!!!!!磁头已到达第1500磁道!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",fp);
continue;
}
else
continue;
}
cnt=cnt+g_num;//累计已产生随机数数量,以下语句控制数量不超过100
if(cnt>90&&cnt<100)
{t=100-cnt;f=1;}
}//............................................ while(i<100)
if(i==100)
{
cout<<"磁头移动道数为:"<<sum<<endl;
fputs("磁头移动道数为:",fp);
fprintf(fp,"%d\n",sum);
fputs("\n\n\n",fp);
}
return sum;
}
void menu() //菜单打印函数
{
cout<<" ∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷"<<endl;
cout<<" ※ ※"<<endl;
cout<<" ※ §磁盘调度算法的模拟实现及对比§ ※"<<endl;
cout<<" ※ ※"<<endl;
cout<<" ∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷"<<endl;
cout<<endl;
cout<<" ∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷"<<endl;
cout<<" ※ §Please Select One You Want To Do§ ※"<<endl;
cout<<" ※ 1]:FCFS算法 ※"<<endl;
cout<<" ※ 2]:SSTF算法 ※"<<endl;
cout<<" ※ 3]:SCAN算法 ※"<<endl;
cout<<" ※ 4]:CSCAN算法 ※"<<endl;
cout<<" ※ 5]:LOOK算法 ※"<<endl;
cout<<" ※ 6]:各种算法比较 ※"<<endl;
cout<<" ※ 7]:EXIT ※"<<endl;
cout<<" ∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷∷"<<endl;
cout<<endl;
cout<<"Please select:";
}
main()
{
int i,n;
int sum_1,sum_2,sum_3,sum_4,sum_5;
for(menu(), cin>>i; i!=7; menu(), cin>>i)
switch(i)
{
case 1:{
FCFS();
break ;
}
case 2:{
SSTF();
break;
}
case 3:{
SCAN();
break;
}
case 4:{
CSCAN();
break;
}
case 5:{
LOOK();
break;
}
case 6:{
int sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;
cout<<"计算每种算法的平均效率,这里采用求平均值的方法!\n请输入n(n次调用某种算法):\n";
cin>>n;
for(int j=0;j<n;j++)
{
sum_1=FCFS();
sum1=sum1+sum_1;
sum_2=SSTF();
sum2=sum2+sum_2;
sum_3=SCAN();
sum3=sum3+sum_3;
sum_4=CSCAN();
sum4=sum4+sum_4;
sum_5=LOOK();
sum5=sum5+sum_5;
}
printf("\n^_^");
cout<<"各种算法的平均效率如下:\n";
cout<<"FCFS算法调度:"<<sum1/n<<endl;
cout<<"SSTF算法调度:"<<sum2/n<<endl;
cout<<"SCAN算法调度:"<<sum3/n<<endl;
cout<<"CSCAN算法调度:"<<sum4/n<<endl;
cout<<"LOOK算法调度:"<<sum5/n<<endl;
break;
}
default:cout<<"\n输入有误!\n"; //.........................................有误输入处理
system("pause");
system("cls");
}
if (i==7)
{
cout<<"\n 磁盘调度算法的模拟实现及对比\n\n";
cout<<"〓〓〓〓〓〓〓〓〓〓〓版权所有(C)--05网络工程(1)--钱海钢〓〓〓〓〓〓〓〓〓〓〓\n\n";
cout<<" 个人主页:www.qhgsea.com.cn E-mail:q_hg@163.com QQ:75811753 \n\n";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -