为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

实验磁盘调度

2011-10-26 8页 doc 54KB 56阅读

用户头像

is_314367

暂无简介

举报
实验磁盘调度实验四 磁盘调度 实验目的 编程模拟实现磁盘调度的常用算法或调试分析相关磁盘调度程序,加深对磁盘调度常用算法的理解和实现技巧 实验内容 1.​ 自定义磁盘调度相关的数据结构; 1.​ 依据先来先服务算法(FCFS)、最短寻道优先算法(SSTF)、扫描(SCAN,也称电梯)算法的原理,编写对应函数,模拟系统的磁盘调度服务; 1.​ 为了更好地模拟和评价算法的性能,随机产生需寻道的磁道序列,以磁道序列的首磁道为磁头的当前位置;在SCAN算法中,允许用户指定当前寻道方向; 1.​ 统计以上算法总寻道次数数和平均寻道距离; 1.​ 比...
实验磁盘调度
实验四 磁盘调度 实验目的 编程模拟实现磁盘调度的常用算法或调试相关磁盘调度程序,加深对磁盘调度常用算法的理解和实现技巧 实验内容 1.​ 自定义磁盘调度相关的数据结构; 1.​ 依据先来先服务算法(FCFS)、最短寻道优先算法(SSTF)、扫描(SCAN,也称电梯)算法的原理,编写对应函数,模拟系统的磁盘调度服务; 1.​ 为了更好地模拟和评价算法的性能,随机产生需寻道的磁道序列,以磁道序列的首磁道为磁头的当前位置;在SCAN算法中,允许用户指定当前寻道方向; 1.​ 统计以上算法总寻道次数数和平均寻道距离; 1.​ 比较/分析以上算法的寻道性能,并作出自己的评价。 预备知识 磁盘调度常用算法的相关知识参考课堂《计算机操作系统》教材 实验指导 1、​ 磁道相关数据结构、自定义宏、全局变量 #define MAXTRACKNUM (50+1) //磁道号序列最大长度 #define LENGTH sizeof(struct TRACK) struct TRACK //磁道链 { struct TRACK *pre; int num; //磁道号 struct TRACK *next; }; int trackarray[MAXTRACKNUM]; //磁道号序列,-1为磁道序列结束 2、函数声明 struct TRACK* track_sort(); //按磁道号大小加入磁道链表排序 int FCFS(int array[]); //先来先服务 // array: 需寻道的磁道号序列 int SSTF(struct TRACK *head, int now); //最短寻道时间优先 //head: 磁道链表链头指针,now: 当前磁头位置 int SCAN(struct TRACK *head,int now,int direction); //扫描(电梯)算法 //head: 磁道链表链头指针 //now: 当前磁头位置 //direction: 当前磁头方向3、参考代码 1、​ 参考代码 //先来先服务,array: 需寻道的磁道号序列 int FCFS(int array[]) { int i,j,sum=0; printf("\nFCFS算法寻道...\n"); for(i=1;array[i]!=-1;i++) { printf(" %d ",array[i]); if((i+1)%5 == 0)printf("\n"); } i=0; for(i=0,j=1;array[j]!=-1;i++,j++) { if(array[i]>array[j]) sum+=(array[i]-array[j]); else sum+=(array[j]-array[i]); } return(sum); } ////最短寻道时间优先,head: 磁道链表链头指针,now: 当前磁头位置 int SSTF(struct TRACK *head, int now) { struct TRACK *p,*lp,*rp; int i=0,sum=0,front,behind; p=head; printf("\nSSTF算法寻道...\n"); while(p->num!=now) p=p->next;/*查找当前磁道*/ lp=p->pre; rp=p->next; do { if(p->next!=NULL&&p->pre!=NULL) { front=p->num-lp->num; behind=rp->num-p->num; if(front>=behind) { sum+=behind; p=rp; printf(" %d ",p->num); i++; if((i+1)%5 == 0)printf("\n"); rp=p->next; } else { sum+=front; p=lp; printf(" %d ",p->num); i++; if((i+1)%5 == 0)printf("\n"); lp=p->pre; } } else { if(p->next==NULL) { while(lp!=NULL&&lp->num!=0) { sum+=p->num-lp->num; p=lp; printf(" %d ",p->num); i++; if((i+1)%5 == 0)printf("\n"); lp=p->pre; } return(sum); } if(p->pre==NULL) { while(rp!=NULL&&rp->num!=0) { sum+=rp->num-p->num; p=rp; printf(" %d ",p->num); i++; if((i+1)%5 == 0)printf("\n"); rp=p->next; } return(sum); } } }while(p->next!=NULL||p->pre!=NULL); } //扫描(电梯)算法,head: 磁道链表链头指针,now: 当前磁头位置,direction: 当前磁头方向 int SCAN(struct TRACK *head,int now,int direction) { struct TRACK *p,*pp; int i=0, sum=0; printf("\nSCAN算法寻道...\n"); p=head; while(p->num!=now) p=p->next;/* */ pp=p; if(direction=='y'||direction=='Y') { while(pp->next!=NULL) { sum+=pp->next->num-pp->num; pp=pp->next; printf(" %d ",pp->num); i++; if((i+1)%5 == 0)printf("\n"); } sum+=pp->num-p->pre->num; pp=p->pre; if(pp->num==0) return(sum); else { while(pp->pre!=NULL) { sum+=pp->num-pp->pre->num; printf(" %d ",pp->num); i++; if((i+1)%5 == 0)printf("\n"); pp=pp->pre; } printf(" %d ",pp->num); i++; if((i+1)%5 == 0)printf("\n"); return(sum); } } else //direction=='n'|direction=='N' { while(pp->pre!=NULL) { sum+=pp->num-pp->pre->num; pp=pp->pre; printf(" %d ",pp->num); i++; if((i+1)%5 == 0)printf("\n"); } sum+=p->next->num-pp->num; pp=p->next; if(pp->num==0) return(sum); else { while(pp->next!=NULL) { sum+=pp->next->num-pp->num; printf(" %d ",pp->num); i++; if((i+1)%5 == 0)printf("\n"); pp=pp->next; } printf(" %d ",pp->num); i++; if((i+1)%5 == 0)printf("\n"); return(sum); } } } //主函数代码 void main() { struct TRACK *head; //磁道链表链头指针 int seektime=0; int i,direction,space=0; int ch, select; printf("\n随机产生磁道序列.... \n"); srand( (unsigned)time( NULL ) ); for(i=0;i'4') { if(select==27) { printf("\n\n"); goto Exit; } goto Input; } putchar(select); if(getch()==8) //backsapce key { putchar(8); putchar(' '); putchar(8); goto Input; } printf("\n\n"); switch(select) { case '1': goto FCFS; case '2': goto SSTF; case '3': goto SCAN; case '4': goto Exit; } FCFS: seektime=FCFS(trackarray);/* */ printf("FCFS算法平均寻道距离: %.2f 条磁道\n",seektime/100.); goto Menu; SSTF: seektime=SSTF(head,trackarray[0]); printf("SSTF算法平均寻道距离: %2.f 条磁道\n",seektime/100.); goto Menu; SCAN: printf("正方向寻道(Y/N)? "); direction=getch(); putchar(direction); seektime=SCAN(head,trackarray[0],direction); printf("SCAN算法平均寻道距离: %.2f 条磁道\n",seektime/100.); goto Menu; Exit: printf("\n确定退出吗?(Y/N)"); ch=getch(); putch(ch); if(ch=='Y' || ch=='y') { printf("\n谢谢使用本系统!\n"); printf("按任意键退出本系统..."); getch(); exit(0); } } 4、实验记录与分析 图4.1随机产生磁道号序列. 图4.2 磁盘调度模拟系统主菜单 图4.3 FCFS算法寻道序列及平均寻道距离 先来先服务FCFS(First-come,First-served)是一种最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。 优点: 公平、简单,每个进程的请求都能依次得到处理。 缺点: 未对寻道进行优化,致使平均寻道时间可能较长。 本实验随机产生50个需寻道的磁道号序列,以第一磁道号为当前磁头位置,实际寻道序列见图4.3,平均寻道距离为10552.82条磁道; 其他磁盘调度算法实验记录与性能分析,参考FCFS算法进行。 5、思考 1​ 磁盘访问时间主要有哪些部分构成?要提高磁盘调度效率,主要在哪方面下手更好? 1​ 最短寻道时间优先算法与扫描(电梯)算法有什么异同?如何改进SCAN算法?
/
本文档为【实验磁盘调度】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索