操作系统 磁盘管理实验

  • 实验内容:
    要求模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯法三种磁盘调度算法,输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数

测试样例(磁头起始位置是53)

8

98 183 37 122 14 124 65 67

 

#include<iostream>
#include<ctime>
#include<algorithm>

using namespace std;

int num; //磁道访问序列数目
int * disk;//储存磁道访问序列的一维数组
int head;//磁头最初的位置

int totalMove;//移动总磁道数
int * path;//储存移动路径
bool * mark;//标记磁道是否访问过


/*快速排序,对数组a[]的下标start-end的元素从小到大排序*/
void quickSort(int *a , int start , int end){
	if(start < end){
		int k =a[start];
		int i =start, j = end;
		while(i < j ){
			while(i <j && a[j] >= k)
				j--;
			swap(a[i], a[j]);
			while(i < j && a[i] <= k)
				i++;
			swap(a[i], a[j]);

		}
		quickSort(a, start, j -1);
		quickSort(a, j + 1, end);
	}
}


void init(){

	for(int i = 0; i < num; i++)
		path[i] = -1;//初始路径
	totalMove = 0;//总移动次数是0

	mark = new bool[num + 2];//标记数组
	
}

void  FCFS(const int & head ){//先来先服务
	init();
	for(int i = 0; i < num; i++)//路径就是移动轨迹了
		path[i] = disk[i];

	int p = head;

	for(int i = 0; i < num; i++){//求移动总磁道数
		totalMove += abs((disk[i] - p));
		p = disk[i];
	}
	return ; 

}

void SSTF(const int & head){//最短寻道时间优先
	init();

	for(int i = 0; i < num; i++)//初始所有磁道disk[i]没有走过
		mark[i] = false;

	int min;//记录离当前磁头最近的磁道的下标
	int minDist;//记录离当前磁头最近的磁道的距离
	int p = head;//磁头
	int now = 0;//路径指针
	while(true){
		min = -1;//初始min 和 minDist
		minDist = INT_MAX;
		for(int i = 0; i < num; i++){
			if(mark[i] == false && ( abs(disk[i] - p) < minDist) ){//如果disk[i]没走过且距离磁头更近
				
				min = i;//记录并更新
				minDist = abs(disk[i] - p);
			}
		}
		if(min == -1)//所有磁道访问序列走完了程序退出循环结束
			break;

		totalMove += minDist;//增加移动总磁道数
		p = disk[min];//更新当前磁头位置
		mark[min] = true;//标记该磁道被访问了
		path[now++] = disk[min];//添加到路径

	}

	return ; 
}


void calBackward(int start ){//向0磁道的方向移动
	//mark[start] = true;
	int now = 0;
	int p = start;
	for(int i = start - 1; i >= 0; i--){/*统计向0磁道的移动次数*/
		totalMove += abs(disk[i] - disk[p]);
		p = i;
		path[now++] = disk[i];//记录路径
		//mark[i] = true;
	}

	for(int i = start+ 1; i < num + 1; i++){/*统计向199磁道移动次数*/
		totalMove += abs(disk[i] - disk[p]);
		p = i;
		path[now++] = disk[i];
	}

	return ; 
	
	
}

void calForward(int start ){//向199磁道的方向移动(向磁道号增大的方向移动)
	int now = 0;
	int p = start;
	for(int i = start + 1; i < num + 1; i++){
		totalMove += abs(disk[i] - disk[p]);
		p = i;
		path[now++] = disk[i];
	}

	for(int i = start - 1; i >=0; i--){
		totalMove += abs(disk[i] - disk[p]);
		p = i;
		path[now++] = disk[i];
	}
	
	return ; 
}

void elevator(const int & head){//电梯法
	init();

	int choice;
	int pos = -1;
	cout<<"输入当前磁头移动方向, 输入 0 表示磁头当前正向0道方向移动,否则是向199道方向移动"<<endl;
	cin>>choice;
	disk[num] = head;//丢入寻道序列

	//sort(disk, disk + num + 1);//对这 num + 1 个元素排序
	quickSort(disk, 0, num);
	for(int i = 0;  i < num + 1; i++){//找到排序后磁头所在的位置
		if(disk[i] == head)
			pos = i;
	}


	if(choice == 0){//向0磁道方向移动
		calBackward(pos);
	
	}
	else
		calForward(pos);

	return ; 
		
	


}

void output(){/*输出移动轨迹*/
	cout<<"移动轨迹为:"<<endl;
	cout<<head<<"->";
	for(int i = 0; i < num - 1; i++){
		cout<<path[i]<<"->";
	}
	cout<<path[num - 1]<<"  ";
	cout<<"移动的总磁道数目为: "<<totalMove<<endl;
	

}


int main(){
	
	cout<<"请输入 多少道请求访问磁道序列"<<endl;
	cin>>num;
	disk = new int[num + 2];//磁盘序列
	path = new int[num +2];//储存路径
	cout<<"输入磁道请求访问序列"<<endl;

	for(int i = 0; i < num; i++){
		cin>>disk[i];
	}

	cout<<"请输入磁头初始所在的磁道"<<endl;
	cin>>head;

	cout<<"/*******利用先来先服务方法*******/"<<endl;
	
	FCFS(head);//先来先服务法

	output();//输出轨迹

	cout<<"///-----------------------------------------------"<<endl;


	cout<<"/*******利用最短寻道时间优先法*******/"<<endl;

	SSTF(head);//最短寻道优先法
	output();


	cout<<"///-----------------------------------------------"<<endl;

	cout<<"/*******利用电梯法*******/"<<endl;

	elevator(head);//电梯法
	output();

	system("pause");
}

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值