首页 电梯调度算法

电梯调度算法

举报
开通vip

电梯调度算法湖北师范学院《操作系统》实验报告 学生学号:2011115010820 学生班级:1108 学生姓名:汤凯 指导老师:李晓瑾完成时间:2013年12月28号实验三驱动调度实验内容模拟电梯调度算法,实现对磁盘的驱动调度。实验目的磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请求等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算...

电梯调度算法
湖北师范学院《操作系统》实验 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 学生学号:2011115010820 学生班级:1108 学生姓名:汤凯 指导老师:李晓瑾完成时间:2013年12月28号实验三驱动调度实验内容模拟电梯调度算法,实现对磁盘的驱动调度。实验目的磁盘是一种高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出任务,在多道程序设计系统中,往往同时会有若干个要求访问磁盘的输入输出请求等待处理。系统可采用一种策略,尽可能按最佳次序执行要求访问磁盘的诸输入输出请求,这就叫驱动调度,使用的算法称驱动调度算法。驱动调度能降低为若干个输入输出请求服务所需的总时间,从而提高系统效率。本实验模拟设计一个驱动调度程序,观察驱动调度程序的动态运行过程。实验题目模拟电梯调度算法,对磁盘进行移臂调度和旋转调度。数据结构及其说明:constintPCB=100; //定义100个进程intpcbs_num=0; //记录当前io表的进程个数typedefstructprocess //请求io表{charpname[10]; //进程名 intCylinder; //柱面号 intTrack; //磁道号 intRecord; //物理记录号 intWay;}PROCESS;PROCESSpcbs[PCB]; PROCESSa; //记录当前位置(柱面号、物理记录号)采用带头节点的循环链表存源程序并附上注释:publicclassDiskDispatchArithmetic{publicstaticArrayList<io>list=newArrayList<io>();//io表publicstaticArrayList<io>waitlist=newArrayList<io>();//输入的值不符合时,临时存入此表staticStringcourse="Null";//定义静态值存放进程名staticintcylinder=0;//定义静态值存放柱面位置staticinttrack=0;//定义静态值存放磁道位置staticintrecord=0;//定义静态值存放物理记录位置staticStringside="up";//定义静态值存放当前摆臂方向,初始为upBufferedReaderstreamin=newBufferedReader(newInputStreamReader(System.in));publicvoidisBigger(){//通过随机数比较,确定下一步执行何种操作DiskDispatchArithmeticds=newDiskDispatchArithmetic();Scannersc=newScanner(System.in);System.out.println("输入随机数:");//doublei=Math.random();//inti=1;//inti=0;inti=sc.nextInt();if(list.isEmpty()&&waitlist.isEmpty()){System.out.println("当前io表为空,等待输入");ds.toContinue();}else{if(i>=0.5){System.out.println("随机数为"+i+"大于0.5,执行驱动调度");ds.Scheduling();}else{System.out.println("随机数为"+i+"小于0.5,执行接受请求");ds.Request();}}}publicbooleanisHave(inta,intb,intc){ArrayList<io>list1=(ArrayList<io>)list.clone();intflag=0;for(inti=0;i<list.size();i++){ioio=(io)list.get(i);if(a==io.getCylinder()&&b==io.getTrack()&&c==io.getRecord()){flag=1;}else{flag=0;}}if(flag==1){returntrue;}else{returnfalse;}}publicvoidRequest(){//运行后添加io表的元素ioio=newio();Scannersc=newScanner(System.in);System.out.println("输入进程名柱面号磁道号物理记录号");io.setCourse(sc.next());io.setCylinder(sc.nextInt());io.setTrack(sc.nextInt());io.setRecord(sc.nextInt());if("up".equals(side)){//摆臂方向为up时,当输入值小于当前操作数的值时,不加入list进行比较而是存放进waitlist中等待if(io.getCylinder()<cylinder){if(io.getTrack()<track){if(io.getRecord()<record){waitlist.add(io);}}}else{list.add(io);}}if("down".equals(side)){//摆臂方向为down时,当输入值大于当前操作数的值时,不加入list进行比较而是存放进waitlist中等待if(io.getCylinder()>cylinder){if(io.getTrack()>track){if(io.getRecord()>record){waitlist.add(io);}}}else{list.add(io);}}toContinue();}publicvoidfirstRequest(){//初始化io表元素ioio=newio();Scannersc=newScanner(System.in);System.out.println("输入进程名柱面号磁道号物理记录号");io.setCourse(sc.next());io.setCylinder(sc.nextInt());io.setTrack(sc.nextInt());io.setRecord(sc.nextInt());list.add(io);}publicvoidScheduling(){ArrayList<io>list1=(ArrayList<io>)list.clone();ArrayList<io>list2=(ArrayList<io>)list.clone();intfcylinder=cylinder;//当前所在的柱面intftrack=track;//当前所在的磁道intfrecord=record;//当前所在的物理记录if("up".equals(side)){//判断side方向为up时执行ComparatorIocomparator=newComparatorIo();Collections.sort(list1,comparator);//调用从小到大排序进行排序System.out.println("当前io表:");System.out.println("进程名"+""+"柱面号"+""+"磁道号"+""+"物理记录号");for(inti=0;i<list2.size();i++){//打印当前io表ioio=(io)list2.get(i);System.out.println(io.getCourse()+""+io.getCylinder()+""+io.getTrack()+""+io.getRecord());}for(inti=0;i<waitlist.size();i++){ioio=(io)waitlist.get(i);System.out.println(io.getCourse()+""+io.getCylinder()+""+io.getTrack()+""+io.getRecord());}intp=0;//当前要访问的下一个记录在io表中的位置for(inti=0;i<list1.size();i++){//通过比较找到下一个准备操作的元素ioio=(io)list1.get(i);if(fcylinder>io.getCylinder()){if(ftrack>io.getTrack()){if(frecord>io.getRecord()){p=i;}}}}if(p==0&&list.size()>=1){//若找到比当前值小的元素,进行list表中对应元素的删除并继续ioio=(io)list1.get(p);inta,b,c;a=io.getCylinder()-cylinder;b=io.getTrack()-track;c=io.getRecord()-record;System.out.println("当前所指向进程:");System.out.println("进程名"+""+"柱面号"+""+"磁道号"+""+"物理记录号");System.out.println(course+""+cylinder+""+track+""+record);if(a!=0){//若比较得到当前柱面号与下一个准备操作进程柱面号不同,则按照side方向寻找适合值System.out.println("即将调度的进度不在此柱面号中,按照"+side+"方向寻找适配进度");}if(a==0&&b!=0){//若比较得到当前磁道号与下一个准备操作进程磁道号不同,则按照side方向寻找适合值System.out.println("即将调度的进度在此柱面号中,但是不在此磁道号中,按照"+side+"方向寻找适配进度");}if(a==0&b==0&c!=0){//仅物理记录号变化时,按照side方向寻找适合值System.out.println("即将调度的进度在此柱面号,磁道号中,但是不在此物理记录号中,按照"+side+"方向寻找适配进度");}course=io.getCourse();cylinder=io.getCylinder();track=io.getTrack();record=io.getRecord();System.out.println("将要调度的进程:");System.out.println("进程名"+""+"柱面号"+""+"磁道号"+""+"物理记录号");System.out.println(course+""+cylinder+""+track+""+record);System.out.println("当前摆臂方向不变,为"+side);list.remove(io);//删除当前所指向io表元素}elseif(list.isEmpty()){//list表为空,则改变side指向为downSystem.out.println("当前所指向进程:");System.out.println(cylinder+""+track+""+record);side="down";System.out.println("由于没有比当前所指向进程更大的进程,移动方向改变,为"+side);for(inti=0;i<waitlist.size();i++){//将waitlist中的值添加至list表中ioio=(io)waitlist.get(i);ioio1=newio();io1.setCourse(io.getCourse());io1.setCylinder(io.getCylinder());io1.setTrack(io.getTrack());io1.setRecord(io.getRecord());list.add(io1);}waitlist.clear();//清空waitlist}toContinue();}if("down".equals(side)){//当side为down,则进行从大到小排序,流程同上ComparatorIoTurncomparator=newComparatorIoTurn();Collections.sort(list1,comparator);System.out.println("当前io表:");System.out.println("进程名"+""+"柱面号"+""+"磁道号"+""+"物理记录号");for(inti=0;i<list2.size();i++){ioio=(io)list2.get(i);System.out.println(io.getCourse()+""+io.getCylinder()+""+io.getTrack()+""+io.getRecord());}for(inti=0;i<waitlist.size();i++){ioio=(io)waitlist.get(i);System.out.println(io.getCourse()+""+io.getCylinder()+""+io.getTrack()+""+io.getRecord());}intp=0;for(inti=0;i<list1.size();i++){ioio=(io)list1.get(i);if(fcylinder<io.getCylinder()){if(ftrack<io.getTrack()){if(frecord<io.getRecord()){p=i;}}}}System.out.println("当前所指向进程:");System.out.println("进程名"+""+"柱面号"+""+"磁道号"+""+"物理记录号");System.out.println(course+""+cylinder+""+track+""+record);if(p==0&&list.size()>=1){ioio=(io)list1.get(p);inta,b,c;a=io.getCylinder()-cylinder;b=io.getTrack()-track;c=io.getRecord()-record;if(a!=0){System.out.println("即将调度的进度不在此柱面号中,按照"+side+"方向寻找适配进度");}if(a==0&&b!=0){System.out.println("即将调度的进度在此柱面号中,但是不在此磁道号中,按照"+side+"方向寻找适配进度");}if(a==0&b==0&c!=0){System.out.println("即将调度的进度在此柱面号,磁道号中,但是不在此物理记录号中,按照"+side+"方向寻找适配进度");}course=io.getCourse();cylinder=io.getCylinder();track=io.getTrack();record=io.getRecord();System.out.println("将要调度的进程:");System.out.println("进程名"+""+"柱面号"+""+"磁道号"+""+"物理记录号");System.out.println(course+""+cylinder+""+track+""+record);System.out.println("当前摆臂方向不变,为"+side);list.remove(io);//删除当前所指向io表元素}elseif(list.isEmpty()){System.out.println("当前所指向进程:");System.out.println(cylinder+""+track+""+record);side="down";System.out.println("由于没有比当前所指向进程更小的进程,移动方向改变,为"+side);for(inti=0;i<waitlist.size();i++){ioio=(io)waitlist.get(i);ioio1=newio();io1.setCourse(io.getCourse());io1.setCylinder(io.getCylinder());io1.setTrack(io.getTrack());io1.setRecord(io.getRecord());list.add(io1);}waitlist.clear();}toContinue();}toContinue();}publicvoidtoContinue(){//输入确定是否继续DiskDispatchArithmeticds=newDiskDispatchArithmetic();System.out.println();System.out.print("输入任意值继续,输入N退出:");try{Stringstr=streamin.readLine();if(str.equals("N")||str.equals("n")){System.out.println();System.out.println("安全退出!");System.exit(0);}else{ds.isBigger();}}catch(IOExceptionex){}}publicstaticvoidmain(String[]args){DiskDispatchArithmeticds=newDiskDispatchArithmetic();Scannersc=newScanner(System.in);System.out.println("初始化多少请求?");inta=sc.nextInt();System.out.println("输入"+a+"个请求:");for(inti=0;i<a;i++){ds.firstRequest();}ds.isBigger();}}流程图:运行结果及截图: 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf :通过模拟电梯调度算法实现对磁盘的驱动调度的设计,使我更加深刻的了解了磁盘驱动调度的工作的过程。初始化“请求I/O”表,置当前移臂方向为里移;置当前位置为0号柱面,0号物理记录。当有等待访问磁盘的进程时,按电梯调度算法从中选择一个等待访问者,按该进程指定的磁盘物理地址启动磁盘为其服务。对移动臂磁盘来说,驱动调度分移臂调度和旋转调度。电梯调度算法的调度策略是与移动臂的移动方向和移动臂的当前位置有关的,所以每次启动磁盘时都应登记移臂方向和当前位置。电梯调度算法总是优先选择与当前柱面号相同的访问请求,从这些请求中再选择一个能使旋转距离最短的等待访问者。如果没有与当前柱面号相同的访问请求,则根据移臂方向来选择,每次总是沿臂移动方向选择一个与当前柱面号最近的访问请求,若沿这个方向没有访问请求时,就改变臂的移动方向。
本文档为【电梯调度算法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
徐姐2018
技术学院会计学毕业后掌握基本的会计知识技能,取得会计从业资格证,多年的财务工作经验,现认多家小企的财务会计!
格式:doc
大小:292KB
软件:Word
页数:11
分类:企业经营
上传时间:2018-05-16
浏览量:26