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

📄 disk.cpp

📁 采用C语言编写的源码,磁盘的调度模拟(没有图形界面)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			}
			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 + -