要求:
1。实现三种算法:
1。先来先服务
2。最短寻道优先(老师会给当前磁头的位置)
3。电梯算法
2。磁道服务顺序从指定的文本文件(TXT文件)中取出
3。输出:
第一行:磁道的服务顺序
第二行:显示移动总道数
本程序包括:FIFO,最短寻道优先调度算法,电梯算法
磁盘调度
#include < stdio.h >
#include < iostream.h >
#include < string .h >
#include < math.h >
const int MAXQUEUE = 200 ; // 定义队列最大数
// 结构体定义
typedef struct node{
int go;
int visited;
}qu;
qu queue[MAXQUEUE];
int quantity;
int start; // 定义开始时磁头所在位置
// 初始化函数
void initial()
{
int i;
for (i = 0 ;i < MAXQUEUE;i ++ ){
queue[i].go =- 1 ;
queue[i].visited = 0 ;
}
start = 53 ; // 磁头的初始位置
}
// 读入磁道号流
void readData()
{
FILE * fp;
char fname[ 20 ];
int temp,i;
cout << " 请输入磁道号流文件名: " ;
strcpy(fname, " 7hard.txt " );
cin >> fname;
if ((fp = fopen(fname, " r " )) == NULL){
cout << " 错误,文件打不开,请检查文件名:) " << endl;
}
else {
while ( ! feof(fp)){
fscanf(fp, " %d " , & temp);
queue[quantity].go = temp;
quantity ++ ;
}
cout << endl << " --------------------------------------------- " << endl;
cout << " 所读入的磁道号流: " ;
for (i = 0 ;i < quantity;i ++ ){
cout << queue[i].go << " " ;
}
cout << endl << " 请求数为: " << quantity << endl;
}
}
// FIFO算法
void FIFO()
{
int i;
int total = 0 ;
int current;
cout << endl << " --------------------------------------------- " << endl;
cout << " FIFO算法的访问磁道号顺序流: " ;
current = start;
for (i = 0 ;i < quantity;i ++ ){
cout << queue[i].go << " " ;
total += abs(queue[i].go - current);
current = queue[i].go;
}
cout << endl << " 磁头移过的柱面数: " << total;
}
// 最短寻道优先调度算法
void shortest()
{
int i,j,p;
int total = 0 ;
int current;
cout << endl << " --------------------------------------------- " << endl;
cout << " 最短寻道优先调度算法的访问磁道号顺序流: " ;
current = start;
for (i = 0 ;i < quantity;i ++ ){
p = 0 ;
while (queue[p].visited != 0 ){
p ++ ;
}
for (j = p;j < quantity;j ++ ){
if ((queue[j].visited == 0 ) && (abs(current - queue[p].go) > abs(current - queue[j].go))){
p = j;
}
}
cout << queue[p].go << " " ;
total += abs(queue[p].go - current);
queue[p].visited = 1 ;
current = queue[p].go;
}
cout << endl << " 磁头移过的柱面数: " << total;
}
// 电梯算法
void elevator()
{
int i,j,p,flag;
int total = 0 ;
int current;
cout << endl << " --------------------------------------------- " << endl;
cout << " 电梯调度算法 " << endl;
// 磁头初始向里
cout << " 磁头初始向里的访问磁道号顺序流: " ;
current = start;
for (i = 0 ;i < quantity;i ++ ){
flag = 1000 ;
p =- 1 ;
for (j = 0 ;j < quantity;j ++ ){
if ((queue[j].visited == 0 ) && (queue[j].go >= current)){
if (abs(queue[j].go - current) < flag){
p = j;
flag = abs(queue[j].go - current);
}
}
}
if (p !=- 1 ){
cout << queue[p].go << " " ;
total += abs(queue[p].go - current);
current = queue[p].go;
queue[p].visited = 1 ;
}
else {
for (j = 0 ;j < quantity;j ++ ){
if ((queue[j].visited == 0 ) && (queue[j].go < current)){
if (abs(queue[j].go - current) < flag){
p = j;
flag = abs(queue[j].go - current);
}
}
}
cout << queue[p].go << " " ;
total += abs(queue[p].go - current);
current = queue[p].go;
queue[p].visited = 1 ;
}
}
cout << endl << " 磁头移过的柱面数: " << total << endl;
// 磁头初始向外
for (i = 0 ;i < quantity;i ++ ){
queue[i].visited = 0 ;
}
total = 0 ;
cout << " 磁头初始向外的访问磁道号顺序流: " ;
current = start;
for (i = 0 ;i < quantity;i ++ ){
flag = 1000 ;
p =- 1 ;
for (j = 0 ;j < quantity;j ++ ){
if ((queue[j].visited == 0 ) && (queue[j].go <= current)){
if (abs(queue[j].go - current) < flag){
p = j;
flag = abs(queue[j].go - current);
}
}
}
if (p !=- 1 ){
cout << queue[p].go << " " ;
total += abs(queue[p].go - current);
current = queue[p].go;
queue[p].visited = 1 ;
}
else {
for (j = 0 ;j < quantity;j ++ ){
if ((queue[j].visited == 0 ) && (queue[j].go > current)){
if (abs(queue[j].go - current) < flag){
p = j;
flag = abs(queue[j].go - current);
}
}
}
cout << queue[p].go << " " ;
total += abs(queue[p].go - current);
current = queue[p].go;
queue[p].visited = 1 ;
}
}
cout << endl << " 磁头移过的柱面数: " << total;
}
// 显示版权信息函数
void version()
{
cout << endl << endl;
cout << " ┏━━━━━━━━━━━━━━━━━━━━━━━┓ " << endl;
cout << " ┃ 磁盘调度算法系统 ┃ " << endl;
cout << " ┠───────────────────────┨ " << endl;
cout << " ┃ (c)All Right Reserved Neo ┃ " << endl;
cout << " ┃ sony006@163.com ┃ " << endl;
cout << " ┃ version 2004 build 1122 ┃ " << endl;
cout << " ┗━━━━━━━━━━━━━━━━━━━━━━━┛ " << endl;
cout << endl << endl;
}
void main()
{
int i;
version();
initial();
readData();
FIFO();
shortest();
for (i = 0 ;i < quantity;i ++ ){
queue[i].visited = 0 ;
}
elevator();
}