📄 disksched.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 + -