(七)磁盘调度

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

 

转载于:https://my.oschina.net/garyun/blog/602936

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值