博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(七)磁盘调度
阅读量:6278 次
发布时间:2019-06-22

本文共 4385 字,大约阅读时间需要 14 分钟。

  hot3.png

要求:

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

你可能感兴趣的文章
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>
基于Internet的软件工程策略
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
Vue------第二天(计算属性、侦听器、绑定Class、绑定Style)
查看>>