操作系统--磁盘调度模拟实验

设计并实现一个分别利用下列磁盘调度算法进行磁盘调度的模拟程序。

(1)扫描算法(向内寻道和向外寻道)

(2)循环扫描算法

设计要求:

1. 磁头初始磁道号,磁头初始运动方向,序列长度,磁道号序列等数据可键盘输入。

2. 最好能实现磁道号序列中磁道号的动态增加。

3. 磁道访问序列以链表的形式存储。

4. 给出各磁盘调度算法的调度顺序和平均寻道长度。

代码实现:

#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
#include<iomanip>
#include <stdlib.h>
using namespace std;
class LinList;
struct  LinNode
{
	int no;
	LinNode *next;
};
class LinList
{
private :
	LinNode *head;
	
public :
	int size;
	LinList()   //构造函数,用于构造头结点和声明长度
	{
		head=new LinNode;
		head->next=NULL;
		size=0;
	}

	void Insert(int no)//插入函数
	{
		LinNode *newnode=new LinNode;
		newnode->no=no;
		newnode->next=NULL;
		Index(size-1)->next=newnode;
		size++;
	}

	LinNode *Index(int i)//定位函数
	{
		if(i<-1||i>size-1)
		{
			printf(" ");
			exit(0);
		}
		if(i==-1)return head;
		if(i==0)return head->next;
		LinNode *p=head->next;
		int k=0;
		while(p!=NULL&&k<i)
		{
			p=p->next;
			k++;
		}
		return p;
	}
	
	
		int *sort()//排序
	{
		int count=0;
		int *a=new int [size];
		a[0]=Index(0)->no;
		count++;
		for(int i=1;i<size;i++)
		{
			for(int j=0;j<count;j++)
			{
				if(Index(i)->no<a[j])
				{
					for(int k=count;k>j;k--)
					{a[k]=a[k-1];}
					a[j]=Index(i)->no;
					count++;
					break;
				}
				if(Index(i)->no>=a[j])
				{
					if(j==count-1)
					{a[count]=Index(i)->no;count++;break;}
					else
					{continue;}
				}
			}
		}
		return a;
	}

	
	void SCAN1(int start_place)//电梯调度算法(向外寻道)
	{
		printf(" ->SCAN调度算法(向外寻道)如下:\n ");
		float sum=0;
		float ave;
		int *a=sort();
		for(int i=0;i<size;i++)
		{
			if(start_place<=a[i])
			{for(int m=i;m<size;m++)
				{
					if(i==0&&m==size-1)
					{
					printf("%d",a[m]);
					sum+=abs(a[m]-a[m-1]);
					}
					else
					{
						printf("%d,->",a[m]);
					if(m==i){sum+=abs(start_place-a[i]);}
					else
					{sum+=abs(a[m]-a[m-1]);}
					}
				}
				for(int n=i-1;n>=0;n--)
				{
					if(n==i-1){sum+=abs(a[n]-a[size-1]);}
					if(n!=i-1){sum+=abs(a[n]-a[n+1]);}
					if(n==0){printf("%d\n",a[n]);}
					else
					{
						printf("%d,->",a[n]);}
				}
				ave=sum/size;
				printf("->平均寻道长度为:%f",ave);
				break;
			}
		}
	}
	
	void SCAN2(int start_place)//电梯调度算法(向内寻道)
	{
		printf(" ->SCAN调度算法(向内寻道)如下:\n ");
		float sum=0;
		float ave;
		int *a=sort();
		for(int i=0;i<size;i++)
		{
			if(start_place<=a[i])
			{
				for(int n=i-1;n>=0;n--)
				{
					if(n==i-1){sum+=abs(a[n]-a[size-1]);}
					if(n!=i-1){sum+=abs(a[n]-a[n+1]);}
					if(n==0){printf("%d",a[n]);}
					else
					{
						printf("%d,->",a[n]);}
				}
				
				for(int m=i;m<size;m++)
				{
					if(i==0&&m==size-1)
					{
					printf("%d\n",a[m]);
					sum+=abs(a[m]-a[m-1]);
					}
					else
					{
						printf("->%d,",a[m]);
					if(m==i){sum+=abs(start_place-a[i]);}
					else
					{sum+=abs(a[m]-a[m-1]);}
					}
				}
				
				ave=sum/size;
				printf("->平均寻道长度为:%f",ave);
				break;
			}
		}
	}

	void CSCAN(int start_place)  //循环算法
	{
		printf(" ->CSCAN调度算法如下:\n");
		float sum=0;
		float ave;
		int *a=sort();
		for(int i=0;i<size;i++)
		{
			if(start_place<=a[i])
			{
				for(int m=i;m<size;m++)
				{
					if(i==0&&m==size-1)
					{
						printf("%d",a[m]);
						sum+=abs(a[m]-a[m-1]);
					}
					else
					{
						printf("%d->",a[m]);
					if(m==i){sum+=abs(start_place-a[i]);}
					else
					{sum+=abs(a[m]-a[m-1]);}
					}
				}
				for(int n=0;n<=i-1;n++)
				{
					if(n==0){sum+=abs(a[n]-a[size-1]);}
					if(n!=0){sum+=abs(a[n]-a[n-1]);}
					if(n==i-1){printf("%d\n",a[n]);}
					else
					{printf("%d->",a[n]);}
				}
				ave=sum/size;
				printf(" ->平均寻道长度为:%f",ave);
			break;
			}
		}
	}

	
	void show()//显示函数
	{
		for(int i=0;i<size;i++)
		{
			if(i==size-1)
			{
				printf("%d",Index(i)->no);
			//cout<<Index(i)->no<<endl<<endl;
			break;
			}
			printf("%d->",Index(i)->no);
			//cout<<Index(i)->no<<"->";
		}
	}

};
int main()
{
	printf("		    *********************************\n");
	printf("		    **      丨磁*盘*调*度*2丨     **\n");
	printf("		    *********************************\n");

	LinList linlist;
	int i,start_place;
	printf(" ->请输入需要调度的序列(以0结束):\n");
	scanf("%d",&i);
	while(i)
	{
		linlist.Insert(i);
		scanf("%d",&i);
	}
	printf(" ->请输入开始的磁道号:");
	scanf("%d",&start_place);
	printf(" ->链表的长度为:%d\n",linlist.size);
	printf(" ->单链表显示:\n");
	linlist.show();

	int flag=1;
	while(flag)
	{
	printf("			**************************\n");
	printf("			*   1:返回重新输入磁道   *\n");
	printf("			*   2:循环扫描算法       *\n");
	printf("			*	3:扫描算法       *\n");
	printf("			*	4:EXIT退出       *\n");
	printf("			**************************\n");
	printf(" ->请输入数字:");

	int k;
	scanf("%d",&k);

		switch(k)
		{
		case 1:
			main();break;
		case 2:
			linlist.CSCAN(start_place);
			break;
		case 3:
			{
			printf("                      ******************************\n");
			printf("                      * 5:向外寻道按,6:向内寻道按 *\n");
			printf("                      ******************************\n");
			printf("请输入数字5或6 ->");
			int j;
			scanf("%d",&j);
			switch(j)
			{
			case 5:
				linlist.SCAN1(start_place);break;
			case 6:
				linlist.SCAN2(start_place);break;	
			}
			}
			break;
		case 4:
			{
			flag=0;
			break;
			printf("->请输入任意字符结束:"); 
			getche();}
		}
	}
	return 0;
}

运行结果:

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值