(七)磁盘调度

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

 

posted @ 2010-12-04 14:07  聊聊IT那些事  阅读(470)  评论(0编辑  收藏  举报