⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 (七)磁盘调度.txt

📁 主要集成了操作系统的主要算法
💻 TXT
字号:
(七)磁盘调度

磁盘调度算法 
要求: 
1。实现三种算法: 
1。先来先服务 
2。最短寻道优先(老师会给当前磁头的位置) 
3。电梯算法 
2。磁道服务顺序从指定的文本文件(TXT文件)中取出 
3。输出: 
第一行:磁道的服务顺序 
第二行:显示移动总道数 


本程序包括:FIFO,最短寻道优先调度算法,电梯算法 

VC++调试通过 

(C)copyright by Neo 

欢迎大家测试 请问题请Email:sony006@163.com 
*/ 

#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.go=-1; 
queue.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.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.go<<" "; 
total+=abs(queue.go-current); 
current=queue.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.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.visited=0; 
} 

elevator(); 
}
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -