1、采用模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯法三种磁盘调度算法,对一组请求访问磁道序列输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
2、文本录入数据
//C++语言,Linux下运行
//在相同目录下创建page1.txt文档,输入数据保存
代码如下:
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <list>
#include <fstream>
#define MAX 1111
#define INF 0x3f3f3f3f
using namespace std;
typedef struct Disk_Scheduling
{
double Trackhao;
double Trackshu;
}DKSG;
DKSG ds[MAX];
double track[MAX];
int mark[MAX];
int input(int &n, double &now)
{
int im;
int Min = INF;
fstream infile1("page1.txt");
if (!infile1)
cerr<< "文档打开失败"<<endl;
else {
int data;
infile1>>data;
now =data;
infile1>>data;
n =data;
for (int i =0;i<n; i++){
infile1>>data;
track[i]=data;
double temp=fabs(track[i] - now);
if(temp<Min){
Min=temp;
im=i;
}
}
}
return im;
}
void output(int n)//打印
{
double zong=0;
printf("%s","访问路径:");
for (int i=0; i<n; i++){
printf("%4.2f %s", ds[i].Trackhao,"-> ");
}
printf("\n总横跨磁道数:");
for (int i=0; i<n; i++){
zong=zong+ds[i].Trackshu;
}
printf("%4.2f\n",zong);
}
void FCFS()//先来先服务
{
int n;
double now;
input(n, now);
for (int i = 0;i<n; i++) {
ds[i].Trackhao = track[i];
ds[i].Trackshu = fabs(track[i] - now);
now = track[i];
}
printf("\n先来先服务法:\n");
output(n);
}
void SSTF()//最短寻道时间优先
{
memset(mark, 0, sizeof(mark));
int n;
double now;
int im = input(n, now);
int cnt1, cnt2;
double t1, t2;
for (int i = 0;i<n; i++) {
int Min = INF;
ds[i].Trackhao = track[im];
ds[i].Trackshu = fabs(track[im] - now);
now = track[im];
mark[im] = 1;
for (int j = 0; j<n; j++) {
if (!mark[j]) {
double temp = fabs(track[j] - now);
if (temp < Min) {
Min = temp;
im = j;
}
}
}
}
printf("\n最短寻道时间优先法:\n");
output(n);
}
void SCAN()//电梯法
{
double retrack[MAX];
int n;
double now;
input(n, now);
sort(track, track + n);
int locate = upper_bound(track, track + n, now) - track;
int t = locate;
int k, r;
for (k = 0;k<n - locate; k++) {
retrack[k] = track[k + locate];
}
for (r = k; r<n;r++) {
retrack[r] = track[--t];
}
for (int i = 0;i<n; i++) {
ds[i].Trackhao = retrack[i];
ds[i].Trackshu = fabs(retrack[i] - now);
now = retrack[i];
}
printf("\n电梯法:\n");
output(n);
}
int main()
{
int ca = 0;
do {
printf("\n请选择磁盘调度算法:\n");
printf("1、先来先服务\n2、最短寻道时间优先\n3、电梯法\n0、退出程序\n");
scanf("%d", &ca);
if (ca == 1)FCFS();//先来先服务法
if (ca == 2)SSTF();//最短寻道时间优先法
if (ca == 3)SCAN();//电梯调度算法
printf("\n");
} while (ca);
return 0;
}
运行结果:
//部分代码学习于:https://blog.csdn.net/qq_35685675/article/details/80744467