磁盘调度算法
实现磁盘调度算法,模拟磁盘调度。主要实现了先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描(SCAN)等算法和循环扫描算法(CSCAN)。
Talk is cheap. Show me the code.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#define MAX_DIASKNUMBER 200 //定义磁盘的最大磁道数
#define TRUE 1//定义真值
#define FALSE 0//定义假值
int disk[MAX_DIASKNUMBER + 1] = {
0 };//存放进程请求磁盘I/O请求时的磁道号,且数字0不做磁道号
int disk_currentnumber = 100;//当前访问的磁盘号,假设当前磁道号为100
int choice = 1;//决定扫描方向(默认为1),1-向增加方向;2-向减小方向
typedef struct Disk_struct//磁盘数据结构
{
int disk_nextnumber;//下一个访问的磁盘号
int disk_distence;//计算移动距离
int total_distence;//总的移动距离
int count;//计算输入了几个磁道号
float average_seek_length;//计算平均寻道长度
}DISK;
int COMPARE(const void *a, const void *b)//比较函数,为qsort算法提供比较函数
{
return *(int *)a - *(int *)b;
}
void SCANF()//输入算法
{
int i = 1;//用作给disk数组的下标
char over = 'Y';//用作结束输入标志
while (TRUE)
{
if (over == 'N')
{
break;//结束
}
else
{
printf("请输入被访问的第%d个磁道号:", i);
int e = 0;//用于接收输入的磁道号,并防止输入为字符出现的错误
scanf_s("%d", &e);//输入进程调用的磁道号
int c = 0;
while ((c = getchar()) != '\n');//---也要清空缓冲区防止输入多个字符导致循环多次
if (e)//----输入字符时为报错,通过用一个变量接收再赋值解决
{
disk[i] = (int)e;
i++;
}
else
{
printf("你输入了0或者未按要求输入!请重新输入!\n");
continue;
}
}
while (TRUE)
{
printf("是否继续输入?请选择:(是-Y/y;否-N/n):");//选择是否继续输入
scanf_s("%c", &over, 1);//因为编译器的不同,1表示只读取1个输入字符
int c = 0;
while ((c = getchar()) != '\n');//---也要清空缓冲区防止输入多个字符导致循环多次
if (over == 'y' || over == 'n')//将小写输入转化为大写
{
over = toupper(over);
}
if (over == 'Y' || over == 'N')
{
break;
}
else
{
printf("请按要求输入!\n"); //----控制错误输入
continue;
}
}
}
}
void CHOOSE()
{
printf("请输入磁道扫描方向(默认为I/i):(I/i-向磁道号增加方向;D/d-向磁道号减小方向)\n");
char choose = NULL;//控制选择从什么方向开始
while (TRUE)
{
if (choose == 'I' || choose == 'D')
{
break;
}
scanf_s("%c", &choose, 1);
int c = 0;
while ((c = getchar()) != '\n');//---也要清空缓冲区防止输入多个字符导致循环多次
while (TRUE)
{
if (choose == 'i' || choose == 'd')
{
choose = toupper(choose);
}
if (choose == 'D')
{
choice = 0;
break;
}
else if (choose == 'I')//全局变量choice以默认为1
{
break;
}
else
{
printf("请按要求输入!\n");
break;
}
}
}
}
void SEARCH(int *m, int *p)//寻找第一个磁道号在数组中的位置和求最初的磁头所在的磁道号在数组中的位置
{
for (