📄 disk.cpp
字号:
#include "iostream"
using namespace std;
#include "stdlib.h"
#include "time.h"
#include "math.h"
#include <conio.h>
static unsigned long int next=1;
typedef struct Lnode
{
int flag;
int number;
struct Lnode *prior;
struct Lnode *next;
}*linklist;
int rand1(void)
{
srand(time(0));
next=next*1103515245+rand();
return (unsigned int)(next/65536)%32768;
}
int generate(int returnflag,int t,int *array)
{
int ifgenerate,g_num,g_num1,g_num2,g_num3,flag1=0,flag2=0,flag3=0,n1=0,n2=0,n3=0;
int temp,i,j,erea,e_flag1=0,e_flag2=0,e_flag3=0;
ifgenerate=rand1()%2;
if(ifgenerate==0)
{
return g_num=0;
}
else if(ifgenerate==1)
{
if(returnflag==1)
g_num=t;
else
{
g_num=rand1()%11;
if(g_num==0)
return g_num;
}
while(flag1==0)
{
g_num1=rand1()%11;
if(g_num1<=g_num)
{
n1=g_num1;
flag1=1;
}
}
while(flag2==0)
{
g_num2=rand1()%11;
if(g_num2<=g_num-g_num1)
{
n2=g_num2;
flag2=1;
}
else if(g_num1==g_num)
{
n2=0;
flag2=1;
}
}
g_num3=g_num-n1-n2;
n3=g_num3;
for(i=0;i<g_num;)
{
erea=rand1()%3;
if(erea==0&&e_flag1==0)
{
for(j=0;j<n1;)
{
temp=rand1()%501;
array[i]=temp;
j++;
i++;
}
e_flag1=1;
}
if(erea==1&&e_flag2==0)
{
for(j=0;j<n2;)
{
temp=rand1()%1001;
if(temp>500)
{
array[i]=temp;
j++;
i++;
}
}
e_flag2=1;
}
if(erea==2&&e_flag3==0)
{
for(j=0;j<n3;)
{
temp=rand1()%1501;
if(temp>1000)
{
array[i]=temp;
j++;
i++;
}
}
e_flag3=1;
}
}
}
// cout<<g_num<<endl<<n1<<endl<<n2<<endl<<n3<<endl;
return g_num;
}
Track_list(linklist &headnode,int *array,int g_num,int &j)
{
int i;
linklist p1,p2,p0;
if(j<100)
for(i=0;i<g_num;i++)
{
p0=(struct Lnode*)malloc (sizeof(struct Lnode));
p0->flag=0;
p0->number=array[i];
p0->next=NULL;
p0->prior=NULL;
p1=headnode->next;
if (j==0)
{
headnode->next=p0;
p0->prior=headnode;
}
else
{
while( (p0->number > p1->number) && (p1->next!=NULL) )
{
p2=p1;
p1=p1->next;
}
if(p0->number<=p1->number)
{
if(headnode->next==p1)
{headnode->next=p0;
p0->prior=headnode;}
else
{p2->next=p0;
p0->prior=p2;}
p0->next=p1;
p1->prior=p0;
}
else {p1->next=p0;
p0->prior=p1;}
}
j++;
}
}
int FCFS()//..............................................................FCFS算法
{
int cnt=0,g_num,dist;int sum=0;int k;
int f=0,f0=0,t=0,fg=0,track_num=0,i=0; int pf=0,endflag=0,pnullf=0;
int array[10];
linklist headnode,p,p0,p1,prev;
FILE *fp;
fp=fopen("fcfs.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)
{
for(k=0;k<g_num;k++)
{
p0=(struct Lnode*)malloc (sizeof(struct Lnode));
p0->number=array[k];
p0->next=p0->prior=NULL;
if(headnode->next==NULL)
headnode->next=p0;
else
p1->next=p0;
p1=p0;//有请求回到这里
track_num++;
}
p=(struct Lnode*)malloc (sizeof(struct Lnode));
if(i==0)
p=headnode->next;
else
p=prev->next;
while(p!=NULL&&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);
prev=p;
i++;
if(track_num<100)
{
g_num=generate(f,t,array);
if(g_num==0)//无请求
{
cout<<"磁盘向内圈方向没有新的访问请求!\n";
fputs("磁盘向内圈方向没有新的访问请求!\n",fp);
p=p->next;
if(p==NULL)
{
if(track_num<100)
{
g_num=generate(f,t,array);
while(g_num==0)
g_num=generate(f,t,array);
break;
}
break;
}
}
else
{
if(track_num<100)
{
cout<<"有新的请求!\n";
fputs("有新的请求!\n",fp);
}
break;
}
}
else p=p->next;
}
cnt=cnt+g_num;//累计已产生随机数数量,以下语句控制数量不超过100
if(cnt>90&&cnt<100)
{t=100-cnt;f=1;}
}
if(i==100)
{
cout<<"磁头移动道数为:"<<sum<<endl;
fputs("磁头移动道数为:",fp);
fprintf(fp,"%d\n",sum);
fputs("\n\n\n",fp);
}
return sum;
}
int SSTF()
{ int cnt=0,g_num,dist;int sum=0;int k,j=0;int p_temp_number,n_temp_number,pseekf=0,nseekf=0;
int f=0,ff=0,t=0,fg=0,track_num=0,i=0; int pf=0,endflag=0,pnullf=0;
int array[10];
linklist headnode,p,temp,prev,p_temp,n_temp,check_p;
FILE *fp;
fp=fopen("sstf.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)
p=headnode->next;
else
{
p=temp;
p_temp=n_temp=temp;
while(p_temp!=headnode)
{
if(p_temp->flag==0)
{
pseekf=1;
break;
}
p_temp=p_temp->prior;
}
if(p_temp==headnode)
pseekf=1;
if(pseekf==1)
p_temp_number=p_temp->number;
else p_temp_number=0;
while(n_temp!=NULL)
{
if(n_temp->flag==0)
{
nseekf=1;
break;
}
n_temp=n_temp->next;
}
if(n_temp!=NULL&&nseekf==1)
n_temp_number=n_temp->number;
else
n_temp_number=0;
if(abs(p->number-p_temp_number)-abs(p->number-n_temp_number)>=0)
p=n_temp;
else if (p_temp!=headnode)
p=p_temp;
else p=n_temp;
}//............................................while(i<100)
while(p!=NULL)
{
if(i==0)//计算每一次读取相对于前一次读取的位移
dist=p->number;
else //计算每一次读取相对于前一次读取的位移
dist=abs(p->number-prev->number);
sum=sum+dist;
cout<<"磁头正在读取:"<<p->number<<"磁道,相对位移是:"<<dist<<endl;
p->flag=1;
fputs("磁头正在读取:",fp);
fprintf(fp,"%-5d",p->number);
fputs("磁道,相对位移是:",fp);
fprintf(fp,"%d\n",dist);
prev=temp=p;
i++;
if(j<100)
{
g_num=generate(f,t,array);
if(g_num==0)//无请求
{
cout<<"磁盘没有新的访问请求!\n";
fputs("磁盘向内圈方向没有新的访问请求!\n",fp);
check_p=headnode->next;
while(check_p!=NULL&&check_p->flag!=0)
check_p=check_p->next;
if(check_p!=NULL&&check_p->flag==0)
ff=1;
if((check_p==NULL||ff==0)&&j<100)
{
g_num=generate(f,t,array);
while (g_num==0)
g_num=generate(f,t,array);
break;
}
}
else//有请求
{
cout<<"磁盘向内圈方向有新请求!\n";
fputs("磁盘向内圈方向有新请求!\n",fp);
break;
}
}
else break;
if(f==1)
{
p_temp=n_temp=temp;
while(p_temp!=headnode)
{
if(p_temp->flag==0)
{pseekf=1;break;}
p_temp=p_temp->prior;
}
if(p_temp==headnode)pseekf=1;
if(pseekf==1)p_temp_number=p_temp->number;
else p_temp_number=0;
while(n_temp!=NULL)
{
if(n_temp->flag==0)
{nseekf=1;break;}
n_temp=n_temp->next;
}
if(n_temp!=NULL&&nseekf==1)n_temp_number=n_temp->number;
else n_temp_number=0;
if(abs(p->number-p_temp_number)-abs(p->number-n_temp_number)>=0)
p=n_temp;
else
if (p_temp!=headnode)p=p_temp;
else p=n_temp;
}
}//........................ while(p!=NULL)
cnt=cnt+g_num;//累计已产生随机数数量,以下语句控制数量不超过100
if(cnt>90&&cnt<100)
{t=100-cnt;f=1;}
}
if(i==100)
{
cout<<"磁头移动道数为:"<<sum<<endl;
fputs("磁头移动道数为:",fp);
fprintf(fp,"%d\n",sum);
fputs("\n\n\n",fp);
}
return sum;
}
int SCAN()//.....................................................................SCAN算法
{
int cnt=0,g_num,dist;int sum=0,min_end=0,max_end=0;
int f=0,f0=0,t=0,fg=0,j=0,i=0; int pf=0,endflag=0,endflag2=0,pnullf=0;
int array[10];
linklist headnode,p,p0,temp,prev;
FILE *fp;
fp=fopen("scan.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);//有请求回到这里
if(endflag==0)//磁头从0到1500方向移动
{
p=(struct Lnode*)malloc (sizeof(struct Lnode));
if(i==0)p=headnode->next;
else p=temp->next;
if(endflag2==1)//累计由1500到0转变为由0到1500时从最近0磁道到0磁道的距离
{
min_end=min_end+p->prior->number;
cout<<min_end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -