要求:
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(); }