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