实验报告六磁盘调度算法

班级:软技2班学号:201467003084

姓名:刘道林

一.

实验内容:

熟悉磁盘的结构以及磁盘的驱动调度算法的模拟,编程实现简单常用的磁盘驱动调度算法先来先服务(FIFO)、

电梯调度算法、最短寻找时间优先算法、扫描(双向扫描)算法、单向扫描(循环扫描)算法等。编程只需实现两个算法。

题目可

以选取教材或习题中的相关编程实例。

编程语言建议采用c/c++或Java。模拟程序鼓励采用随机数技术、动态空间分配技术,有条件

的最好能用图形界面展现甚至用动画模拟。

实验性质:验证型。

二.

实验目的和要求

1)掌握使用一门语言进行磁盘驱动调度算法的模拟;

2)编写程序将磁盘驱动调度算法的过程和结果能以 较简明直观的方式展现 出来。

三. 实验原理、方法和步骤

1. 实验原理

磁盘驱动调度对磁盘的效率有重要影响。磁盘驱动调度算法的好坏直接影响辅助存储器的效率,从而影响计算机系统的整体效率。

常用的磁盘驱动调度算法有:最简单的磁盘驱动调度算法是先入先出(FIFO)法。这种算法的实质是,总是严格按时间顺序对磁盘请

求予以处理。算法实现简单、易于理解并且相对公平,不会发生进程饿死现象。但该算法可能会移动的柱面数较多并且会经常更换移

动方向,效率有待提高。

最短寻找时间优先算法:总是优先处理最靠近的请求。该算法移动的柱面距离较小,但可能会经常改变

移动方向,并且可能会发生进程饥饿现象。

电梯调度:总是将一个方向上的请求全部处理完后,才改变方向继续处理其他请求。

扫描(双向扫描):总是从最外向最里进行扫描,然后在从最里向最外扫描。该算法与电梯调度算法的区别是电梯调度在没有最外或

最里的请求时不会移动到最外或最里柱面,二扫描算法总是移到最外、最里柱面。两端的请求有优先服被务的迹象。

循环扫描(单 向扫描):从最外向最里进行柱面请求处理,到最里柱面后,直接跳到最外柱面然后继续向里进行处理。该算法与扫描算法的区别是

,回来过程不处理请求,基于这样的事实,因为里端刚被处理。

2. 实验方法

1)使用流程图描述演示程序的设计思想;

2)选取c/c++、Java等计算机语言,编程调试,最终给出运行正确的程序。

四.

实验结果分析

能够将磁盘驱动调度算法在各种情况下都能得出正确的结论。对FIFO、最短寻找时间优先或电梯调度算法能够

在多次模拟数据下得出平均移动柱面数,并进行效率比较分析

五.源程序代码 #include #include #include #include typedef struct _proc {

char name[32];

/*定义进程名称*/

int team;

/*定义柱面号*/

int ci;

/*定义磁道面号*/

int rec;

/*定义记录号*/

struct _proc *prior;

struct _proc *next; }

PROC;

PROC *g_head=NULL,*g_curr=NULL,*local;

int record=0;

int yi=1; void init() {

PROC *p;

链表(初始I/O表)*/

g_head = (PROC*)malloc(sizeof(PROC));

g_head->next = NULL;

g_head->prior = NULL;

p = (PROC*)malloc(sizeof(PROC));

strcpy(p->name, "P1");

p->team=100;

p->ci=10;

p->rec=1;

p->next = NULL;

p->prior = g_head;

g_head->next = p;

g_curr=g_head->next;

p = (PROC*)malloc(sizeof(PROC));

strcpy(p->name, "P2");

p->team=30;

p->ci=5;

p->rec=5;

/*初始化

p->next = NULL;

p->prior = g_curr;

g_curr->next = p;

g_curr=p;

p = (PROC*)malloc(sizeof(PROC));

strcpy(p->name, "P3");

p->team=40;

p->ci=2;

p->rec=4;

} void PrintInit()

{

p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=p; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P4"); p->team=85; p->ci=7; p->rec=3; p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=p; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P5"); p->team=60; p->ci=8; p->rec=4; p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=g_head->next; local = (PROC*)malloc(sizeof(PROC));

/*选中进程*/ strcpy(local->name, "P0"); local->team=0; local->ci=0; local->rec=0; local->next=NULL; local->prior=NULL;

/*打印I/O表*/ PROC *t = g_head->next; printf("------\n"); printf("

---------I/O LIST---------\n"); printf(" process

team

ci

rec

\n"); while(t!=NULL)

{

printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec );

t = t->next;

}

printf("\n\nCurrent process is :\n");

printf("------------------------------\n\n");

printf(" process

team

ci

rec

\n");

printf("%4s %8d %8d %5d\n", local->name, local->team, local->ci, local->rec );

switch(yi)

{

case 1:

{

printf("current direction is UP\n");

break;

}

case 0:

{

printf("current direction is down\n");

break;

}

} } void acceptreq()

/*接受请求函数*/

{

PROC *p;

p = (PROC*)malloc(sizeof(PROC));

printf("please input the information of the new process\nprocess-name:\nprocess-team\nprocess-ci\nprocess-rec\n");

printf("1.name\n");

scanf("%s",p->name);

printf("2.team 0-199\n");

scanf("%d",&p->team);

/*输入请求进程信息*/

printf("3.ci 0-19\n");

scanf("%d",&p->ci);

printf("4.rec 0-7\n");

scanf("%d",&p->rec);

getchar();

g_curr=g_head;

/*将此节点链入I/O请求表*/

while(g_curr->next!=NULL) g_curr=g_curr->next;

p->next=NULL;

p->prior=g_curr;

g_curr->next=p;

g_curr=g_head->next;

printf("NEW I/O LIST\n\n");

PrintInit();

/*将新的I/O请求表输出*/ } void qddd()

/*驱动调度函数*/

{

PROC *out;

int min;

int max=g_head->next->team;

if (g_head->next==NULL);

/*若已全部调度,则空操作*/

else

{

switch (yi)

{

case 1:

{

min=g_head->next->team;

out=g_head->next;

/*选出最小的team进程,模拟启动此进程*/

strcpy(local->name,out->name);

local->team=out->team;

local->ci=out->ci;

local->rec=out->rec;

for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

{

if (g_curr->team > record)

{

min = g_curr->team;

break;

}

}

for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

{

if (min>=g_curr->team&&g_curr->team>record)

{

min=g_curr->team; out=g_curr;

strcpy(local->name,out->name);

local->team=out->team; local->ci=out->ci; local->rec=out->rec;

}

}

printf("\n-----------------------\n");

printf("the process choosed :\n");

printf(" process

team

ci

rec

\n");

printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );

(g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

(maxteam) max=g_curr->team;

if(max==record)

yi=0;

record=1000;

break;

break;

}/*case 1*/

case /*case 1 的对称过程*/

{

max=g_head->next->team;

strcpy(local->name,out->name);

local->team=out->team;

record = local->team; printf("%d",record); for

{

if

}

{

}

0:

out=g_head->next;

local->ci=out->ci;

local->rec=out->rec;

for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

{

if (g_curr->team < record)

{

max = g_curr->team;

break;

}

(g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

{

if (max<=g_curr->team&&g_curr->team{

max=g_curr->team; out=g_curr;

strcpy(local->name,out->name);

local->team=out->team;

local->ci=out->ci; local->rec=out->rec;

}

}

printf("\n-----------------------\n");

printf("the process choosed :\n");

printf(" process

team

ci

rec

\n");

printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec );

}

for

min=g_head->next->team;

for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

{

if (min>g_curr->team) min=g_curr->team;

}

record = local->team;

if(min==record)

{

yi=1; record=0;

break;

}

break;

}

default : return -1;

}/*switch*/

if (out->next==NULL)

/*将选中的进程从I/O请求表中删除*/

{

out->prior->next=NULL; free(out);

}

else

{

out->prior->next=out->next;

out->next->prior=out->prior;

free(out);

}

}/*else*/ } void acceptnum()

/*通过输入0~1选择‘驱动调度’或是‘接受请求’*/

{

float num;

char c;

while(1)

{

printf("---------------\n");

printf("please input a number between 0 and 1\nnum<=0.5:accept request\nnum>0.5:qudong diaodu\n\nnum==2:I/O LIST\n\nnum=?\n");

scanf("%f",&num);

getchar();

while((num<0||num>1)&&num!=2)

/*过滤不合法数据 注意:本程序其他输入数据可能未过滤*/

{

printf("number ERROR!Input again please!\nnum=?\n ");

scanf("%f",&num);

getchar();

}

if(num>0.5&&num!=2)

/*驱动调度*/

{

if (g_head->next==NULL)

{

printf("\n\n");

printf("---------------------\n");

printf("I/O list is empty!!!\n");

/*请求表为空 无需调度*/

}

else

{

printf("qudong diaodu\n");

qddd();

/*调用函数进行调度*/

}

}

else if (num<=0.5)

/*接受请求*/

{

printf("accept request\n\n");

acceptreq();

}

else if (num==2)

/*通过输入2显示当前请求I/O表*/

{

printf("I/O LIST;");

printf("-------------------\n");

PrintInit();

printf("\n");

printf("-----------------------\n");

printf("choose 'n' to quit else to continue\n");

if(strcmp(c=getchar(),'n')==0||strcmp(c=getchar(),'N')==0)

clrscr();

printf("\n\n\n\n\n\n");

printf("thank you for testing my program!\n");

printf("

---by

01\n");

sleep(2);

printf("\n\nBYEbye!!");

sleep(2);

return -1;

else

{

clrscr();

}

/*输入n离开本程序*/

{

}

}

} } main ()

/*主程序*/ {

init();

PrintInit();

acceptnum(); }

java实现多级反馈队列_多级反馈队列调度算法相关推荐

  1. rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用

    友情提示:全文约2600字,预计阅读时间12分钟 摘要 消息队列作为重要的中间件,广泛用于分布式系统中各子系统间的异步解耦:本文主要介绍了大云消息队列中间件BC-MQ在BC-DeepWatch中的应用 ...

  2. 队列和消息队列_消息队列概述[幻灯片]

    队列和消息队列 昨天,我进行了一次演讲,探讨了使用消息队列的所有方面. 我以前曾写过"您可能不需要消息队列" –现在的结论有些细微差别,但我仍然坚持简单性的观点. 演讲探讨了使用消 ...

  3. java多线程阻塞队列_阻塞队列和多线程消费者,如何知道何时停止

    我有一个单线程生成器,它创建一些任务对象,然后添加到 ArrayBlockingQueue (具有固定大小) . 我也开始了一个多线程的消费者 . 这是一个固定的线程池( Executors.newF ...

  4. java左手握右手_在队列中,向中看齐举哪个手?

    指挥员下达[相中看齐]口令,中间被训者应迅速举起右手,右手握拳,拳眼朝向自己. 单个军人队列动作--立正.稍息.停止间转法.齐步.跑步.立定.敬礼.纵队.横队.集合.解散.整齐.报数. 队列指挥--主 ...

  5. java 消息队列_消息队列-RabbitMQ在JAVA中的应用(1)

    一.环境准备 安装RabbitMq 安装可查看另外文章本文就不做介绍了. 本文使用的erl和RabbitMQ版本分别是10.4和3.7.15 二.进入正题 1.创建SpringBoot项目 1.1.生 ...

  6. 迷宫问题 java 队列_利用队列解决迷宫问题

    首先定义节点的数据类型: //定义节点的数据结构 class Node{ int x; int y; Node next; public Node(int x,int y) { // TODO Aut ...

  7. java onmessage监听消息队列_消息队列(MQ)功能场景

    来自公众号:京东技术 消息队列(MQ)是一种不同应用程序之间(跨进程)的通信方法.应用程序通过写入和检索出入列队的数据(消息)来通信,而无需通过专用链接来连接它们.消息传递指的是程序之间通过在消息中发 ...

  8. ibm mq并发访问队列_消息队列之九问九答

    问题1 为什么要用消息队列呀? 答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式:则带来的后果, 首先,1.外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据, ...

  9. rabbitmq 不同的消费者消费同一个队列_消息队列王者--rabbitMQ深入理解--工作过程、消费模式、持久化等...

    概述 之前已经对rabbitMQ的一些基本概念做了介绍和不同MQ之间的比较,今天主要对rabbitMQ的一些方面做扩展. 01 消息队列 Broker:简单来说就是消息队列服务器实体. Exchang ...

最新文章

  1. 实验三编程、编译、连接、跟踪
  2. Eclipse安装hibernate插件的问题
  3. django设置mysql数据库连接_django如何设置连接mysql数据库
  4. 如何使用python爬取百度图片_【Python】爬取百度图片进行人脸识别
  5. 表单一次性上传多个文件
  6. 魔兽老玩家无需购买《燃烧远征》资料片序列号
  7. python 新建一列_python – 如何在迭代pandas数据框时创建新列并插入行值
  8. 麻瓜编程python爬虫微专业_麻瓜编程·python实战·1-3作业:爬取租房信息
  9. JAVA方法重载优先级
  10. 【使用pycharm管理github仓库】github代码版本控制
  11. lync 2013标准版安装
  12. 全球与中国抗口腔粘膜炎药物市场深度研究分析报告
  13. python爬取公众号阅读量_公众号提升阅读量!免费推荐几个互阅推广平台.
  14. 物联网平台搭建的全过程介绍(五)——基于阿里云物联网平台的Android聊天app源码
  15. 【运行报错】Centos 6 无法使用 yum
  16. 低代码编程核心技术概念
  17. 计蒜客-A1530 Abiyoyo
  18. openwrt对mt7620n的zbt-wa05路由器…
  19. TenSEAL 同态加密(密文传输)
  20. fastjson首字母大写的几种方法

热门文章

  1. Clion运行hello world
  2. 开源数据 Open/Free Data Sources/Datasets
  3. 图解Putty Key Generator使用方法
  4. 跨境服务商去哪里搞钱
  5. python中sendmessage的使用_SendMessage函数的常用消息及其应用大全
  6. moto 917 不想使用TD网人方法
  7. Java-Appium封装实现滑动屏幕效果
  8. 解锁iPad屏幕密码锁方法
  9. 20211015学习总结
  10. 数据库知识点查漏补缺