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

📄 disk.cpp

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