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

📄 disksched.cpp

📁 几个实现操作系统算法的小程序 有哲学家 算法 生产者消费者等算法的实现 供初学者学习参考
💻 CPP
字号:
#include <stdio.h>
#include <math.h>

#define MAX 20
#define INF 999

int length;//被访问磁道的个数

void Sort(int * head, int len);//对数气据由小到大排序
int SSTF(int * head, int value);//最短寻道优先算法
int SCAN(int * head, int value);//扫描算法

int main()
{
	int TrackID[MAX];//磁道序列号
	int Begin;//磁头位置

	printf("please input the length of secquence of track ID: ");
	scanf("%d", &length);//要寻道的磁道个数

	printf("please input the secquence of track ID:\n");
	for(int i = 0; i < length; i++)
		scanf("%d", &TrackID[i]);

	printf("please input the current of track ID: ");
	scanf("%d", &Begin);

	printf("\n*******Shortest Service Time First algorithm********\n");
	SSTF(TrackID, Begin);

	printf("\n*******************Scan algorithm*******************\n");
	SCAN(TrackID, Begin);
	
	return 0;
}
void Sort(int * head, int len)
{//冒泡排序
	int i, j, temp;

	for(i = 0; i < len; i++)
		for(j = 0; j < len - i - 1; j++)
		{
			if( head[j] > head[j+1] )
			{
				temp = head[j];
				head[j] = head[j+1];
				head[j+1] = temp;
			}
		}
}

int SSTF(int * head, int value)
{
	int Min,CurrentID = value;
	int pointer = 0, sum = 0, i, j;
	int MoveLen[MAX] = {0}, Next[MAX];//记录碰头移动的长度和访问磁道的顺序
	bool Finish[MAX];//磁道访问情况

	for(i = 0; i < length; i++)
		Finish[i] = false;

	for(j = 0; j < length; j++)
	{
		Min = INF;
		for(i = 0; i < length; i++)//在未被访问的磁道中找出下一个被访问到的磁道
			if(abs(CurrentID - head[i]) < Min && Finish[i] == false)
			{
				Min = abs(CurrentID - head[i]);
				pointer = i;//记录被访问的磁道位置
			}
		
		MoveLen[j] = Min;
		Next[j] = head[pointer];
		Finish[pointer] = true;
		CurrentID = head[pointer];
	}

	printf("Next Accessed Track\tMove Length\n");
	for(i = 0; i < length; i++)//输出寻道序列和移动长度
		printf("%d\t\t\t%d\n", Next[i], MoveLen[i]);

	for(i = 0; i < length; i++)//输出最平均寻道长度
		sum += MoveLen[i];
	printf("the average seek track length: %.1f\n",(float)sum/length);
	
	return 1;
}

int SCAN(int * head, int value)
{
	int MoveLen[MAX] = {0}, Next[MAX];//记录碰头移动的长度和访问磁道的顺序
	int pointer = 0, CurrentID = value;//记录开始访问磁道的位置和碰头所在磁道
	int sum = 0, i;
	bool flag = false;

	Sort(head, length);//对磁道号进行由小到大的排序

	for(i = 0; i < length; i++)
		if(value <= head[i])
		{//寻找第一个比碰所在磁道大的磁道
			pointer = i;
			flag = true;
			break;
		}
	
	if(flag == false)//所有磁道号比碰头所在磁道号小
		pointer = length - 1;

	for(i = pointer; i < length; i++)
	{//先由里向外访问每一个磁道
		Next[i - pointer] = head[i];
		MoveLen[i - pointer] = abs(head[i] - CurrentID);
		CurrentID = head[i];
	}

	for( i = pointer-1; i >= 0; i--)
	{//再由外向里访问每一个磁道
		Next[length - i - 1] = head[i];
		MoveLen[length - i - 1] = abs(head[i] - CurrentID);
		CurrentID = head[i];
	}
	
	printf("Next Accessed Track\tMove Length\n");
	for(i = 0; i < length; i++)//输出寻道序列和移动的长度
		printf("%d\t\t\t%d\n", Next[i], MoveLen[i]);

	for(i = 0; i < length; i++)//计算平均寻道长度
		sum += MoveLen[i];
	printf("the average seek track length: %.1f\n",(float)sum/length);

	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -