实验报告六磁盘调度算法_第1页
实验报告六磁盘调度算法_第2页
实验报告六磁盘调度算法_第3页
实验报告六磁盘调度算法_第4页
实验报告六磁盘调度算法_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 实验报告六 磁盘调度算法 班级:软技2班 学号:201467003084 姓名:刘道林一 实验内容: 熟悉磁盘的结构以及磁盘的驱动调度算法的模拟,编程实现简单常用的磁盘驱动调度算法先来先服务(FIFO)、电梯调度算法、最短寻找时间优先算法、扫描(双向扫描)算法、单向扫描(循环扫描)算法等。编程只需实现两个算法。 题目可以选取教材或习题中的相关编程实例。 编程语言建议采用c/c+或Java。模拟程序鼓励采用随机数技术、动态空间分配技术,有条件的最好能用图形界面展现甚至用动画模拟。 实验性质:验证型。二 实验目的和要求 1)掌握使用一门语言进行磁盘驱动调度算法的模拟; 2)编写程序将磁盘驱动调度

2、算法的过程和结果能以较简明直观的方式展现 出来。 3 实验原理、方法和步骤 1. 实验原理 磁盘驱动调度对磁盘的效率有重要影响。磁盘驱动调度算法的好坏直接影响辅助存储器的效率,从而影响计算机系统的整体效率。 常用的磁盘驱动调度算法有:最简单的磁盘驱动调度算法是先入先出(FIFO)法。这种算法的实质是,总是严格按时间顺序对磁盘请求予以处理。算法实现简单、易于理解并且相对公平,不会发生进程饿死现象。但该算法可能会移动的柱面数较多并且会经常更换移动方向,效率有待提高。 最短寻找时间优先算法:总是优先处理最靠近的请求。该算法移动的柱面距离较小,但可能会经常改变移动方向,并且可能会发生进程饥饿现象。 电

3、梯调度:总是将一个方向上的请求全部处理完后,才改变方向继续处理其他请求。 扫描(双向扫描):总是从最外向最里进行扫描,然后在从最里向最外扫描。该算法与电梯调度算法的区别是电梯调度在没有最外或最里的请求时不会移动到最外或最里柱面,二扫描算法总是移到最外、最里柱面。两端的请求有优先服被务的迹象。 循环扫描(单向扫描):从最外向最里进行柱面请求处理,到最里柱面后,直接跳到最外柱面然后继续向里进行处理。该算法与扫描算法的区别是,回来过程不处理请求,基于这样的事实,因为里端刚被处理。 2. 实验方法 1)使用流程图描述演示程序的设计思想; 2)选取c/c+、Java等计算机语言,编程调试,最终给出运行正

4、确的程序。四 实验结果分析 能够将磁盘驱动调度算法在各种情况下都能得出正确的结论。对FIFO、最短寻找时间优先或电梯调度算法能够在多次模拟数据下得出平均移动柱面数,并进行效率比较分析五源程序代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>typedef struct _proc char name32; /*定义进程名称*/ int team; /*定义柱面号*/ int ci; /*定义磁道面号*/ int rec; /*定义记录号*/ st

5、ruct _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");

6、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_

7、curr=p; p = (PROC*)malloc(sizeof(PROC); strcpy(p->name, "P3"); p->team=40; p->ci=2; p->rec=4; 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-&g

8、t;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); /*

9、选中进程*/ strcpy(local->name, "P0"); local->team=0; local->ci=0; local->rec=0; local->next=NULL; local->prior=NULL;void PrintInit() /*打印I/O表*/ PROC *t = g_head->next; printf("-n"); printf(" -I/O LIST-n"); printf(" process team ci rec n"); whi

10、le(t!=NULL) printf("%4s %8d %8d %5dn", t->name, t->team, t->ci, t->rec ); t = t->next; printf("nnCurrent process is :n"); printf("-nn"); printf(" process team ci rec n"); printf("%4s %8d %8d %5dn", local->name, local->team, local

11、->ci, local->rec ); switch(yi) case 1: printf("current direction is UPn"); break; case 0: printf("current direction is downn"); break; void acceptreq() /*接受请求函数*/ PROC *p; p = (PROC*)malloc(sizeof(PROC); printf("please input the information of the new processnprocess-n

12、ame:nprocess-teamnprocess-cinprocess-recn"); printf("1.namen"); scanf("%s",p->name); printf("2.team 0-199n"); scanf("%d",&p->team); /*输入请求进程信息*/ printf("3.ci 0-19n"); scanf("%d",&p->ci); printf("4.rec 0-7n");

13、 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 LISTnn"); PrintInit(); /*将新的I/O请求表输出*/void qddd() /*驱动调度函数*

14、/ 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->

15、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

16、_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 %5dn", out->name, out->tea

17、m, out->ci,out->rec ); record = local->team; printf("%d",record); for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) if (max<g_curr->team) max=g_curr->team; if(max=record) yi=0; record=1000; break; break; /*case 1*/ case 0: /*case 1 的对称过程*/ max=g_head->ne

18、xt->team; out=g_head->next; 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) max = g_curr->team; break; for (g_curr=g_head-&

19、gt;next;g_curr!=NULL;g_curr=g_curr->next) if (max<=g_curr->team&&g_curr->team<record) 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("th

20、e process choosed :n"); printf(" process team ci rec n"); printf("%4s %8d %8d %5dn", out->name, out->team, out->ci,out->rec ); 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-&g

21、t;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 ac

22、ceptnum() /*通过输入01选择驱动调度或是接受请求*/ float num; char c; while(1) printf("-n"); printf("please input a number between 0 and 1nnum<=0.5:accept requestnnum>0.5:qudong diaodunnnum=2:I/O LISTnnnum=?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_he

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论