磁盘调度算法---C语言代码实现SSTF和SCAN
设计思路
1、首先初始化需要的数据:
并且将disk[]进行升序排序
int RW = 0;
int count;
printf("\n请输入读写位置:");
scanf("%d", &RW);
printf("\n请输入磁盘序列个数:");
scanf("%d", &count);
int disk[count];
printf("\n请输入磁盘序列内容:");
for (int i = 0; i < count; i++){scanf("%d", &disk[i]);}
printf("\n你的磁盘序列为:");
for (int i = 0; i < count; i++){printf("%5d", disk[i]);}
sort(disk, count); // 对disk[]升序排序
printf("\n排序后的disk[]:");
OutPut(disk, count);
2、通用的方法
打印数组OutPut(int *a, int length);打印数组平均值void OutPer(int *a, int length)这两个方法在不同的算法中都需要调用,所以单独写出来。
// 升序排列
void sort(int *a, int length)
{
for (int i = 0; i < length - 1; i++)
{
for (int j = i + 1; j < length; j++)
{
if (a[i] > a[j])
{
int temp = 0;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
// 打印数组
void OutPut(int *a, int length)
{
for (int i = 0; i < length; i++){printf("%5d", a[i]);}
}
// 打印数组平均值
void OutPer(int *a, int length)
{
float sum = 0;
for (int i = 0; i < length; i++){sum = sum + a[i];}
float per = sum / length;
printf("%5.2f", per);
}
3、SSTF算法
实现思路:
需要的数据:
int distance[count]; // disk的寻道长度
int access[count]; // 寻道的顺序
int point = RW; // 指针 最初为:RW
int left = -1; // 左边的数组位置: 从0开始
int right = -1; // 右边的数组位置;
4、SCAN算法
SSTF实现以后,SCAN相比较更加容易,和SSTF有太多的相似点。相信大家写完SSTF算法,可以更轻松地写出SCAN。
运行结果:
总代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
const int MAX = 1000;
// 升序排列
void sort(int *a, int length)
{
for (int i = 0; i < length - 1; i++)
{
for (int j = i + 1; j < length; j++)
{
if (a[i] > a[j])
{
int temp = 0;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
// 打印数组
void OutPut(int *a, int length)
{
for (int i = 0; i < length; i++){printf("%5d", a[i]);}
}
// 打印数组平均值
void OutPer(int *a, int length)
{
float sum = 0;
for (int i = 0; i < length; i++){sum = sum + a[i];}
float per = sum / length;
printf("%5.2f", per);
}
void SSTF(int *disk, int RW, int count)
{
int distance[count]; // disk的寻道长度
int access[count]; // 寻道的顺序
int point = RW; // 指针 最初为:RW
int left = -1; // 左边的数组位置: 从0开始
int right = -1; // 右边的数组位置;
if (point <= disk[0]) // RW在最左边
{
for (int i = 0; i < count; i++)
{
access[i] = disk[i];
distance[i] = disk[i] - point;
point = disk[i];
}
}
else if (point >= disk[count - 1]) // RW在最右边
{ // RW在最右边
for (int i = 0; i < count; i++)
{
access[i] = disk[count - i - 1];
distance[i] = point - disk[count - i - 1];
point = disk[count - i - 1];
}
}
else // 在序列内
{
// SSTF
// 确定 left,right位置
for (int i = 0; i < count; i++)
{
if (disk[i] < point && disk[i + 1] > point){
left = i;
right = i + 1;
}
}
int counter = 0; // 方便distance[]和access[]存入数据
// point和left,right对比大小
while (counter != count) // 当左右到头时,循环结束
{
if (left == -1 || disk[right] - point < point - disk[left])
{
access[counter] = disk[right];
distance[counter] = disk[right] - point;
point = disk[right];
right++;
counter++;
}
else if (right == count || disk[right] - point > point - disk[left])
{
access[counter] = disk[left];
distance[counter] = point - disk[left];
point = disk[left];
left--;
counter++;
}
}
}
printf("\nSSTF的磁道访问顺序为:");
OutPut(access, count);
printf("\n每次访问寻道距离为:");
OutPut(distance, count);
printf("\n平均访问寻道距离为:");
OutPer(distance, count);
}
void SCAN(int *disk, int RW, int count)
{
int distance[count]; // disk的寻道长度
int access[count]; // 寻道的顺序
int point = RW; // 指针 最初为:RW
int left = -1; // 左边的数组位置: 从0开始
int right = -1; // 右边的数组位置;
for (int i = 0; i < count; i++)
{
if (disk[i] < point && disk[i + 1] > point)
{
left = i;
right = i + 1;
}
}
int leftLen = left;
int rightLen = right;
while (left != -1 || right != count)
{
if (left != -1)
{
for (int i = 0; i <= leftLen; i++)
{
access[i] = disk[left];
distance[i] = point - disk[left];
point = disk[left];
left--;
}
}
else if (left == -1 && right != count)
{
for (int i = rightLen; i < count; i++)
{
access[i] = disk[right];
distance[i]=disk[right]-point;
point=disk[right];
right++;
}
}
else
{
exit;
}
}
printf("\nSCAN的磁道访问顺序为:");
OutPut(access, count);
printf("\n每次访问寻道距离为:");
OutPut(distance, count);
printf("\n平均访问寻道距离为:");
OutPer(distance, count);
}
int main()
{
int RW = 0;
int count;
printf("\n请输入读写位置:");
scanf("%d", &RW);
printf("\n请输入磁盘序列个数:");
scanf("%d", &count);
int disk[count];
printf("\n请输入磁盘序列内容:");
for (int i = 0; i < count; i++){scanf("%d", &disk[i]);}
printf("\n你的磁盘序列为:");
for (int i = 0; i < count; i++){printf("%5d", disk[i]);}
sort(disk, count); // 对disk[]升序排序
printf("\n排序后的disk[]:");
OutPut(disk, count);
while (1)
{
int choose = 0;
printf("\n请选择你要使用的算法:1.SSTF 2.SCAN 3.exit :");
scanf("%d", &choose);
switch (choose)
{
case 1:
/* SSTF code */
SSTF(disk, RW, count);
break;
case 2:
/* SCAN code */
SCAN(disk, RW, count);
break;
case 3:
printf("exit");
break;
default:
printf("你这可是越界了,可不兴这丫");
break;
}
}
return 0;
}