实验四磁盘调度一、实验目的:磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。二、实验内容:模拟电梯调度算法,对磁盘进行移臂操作三、提示及要求:1.假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。2.磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。3.由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。4.为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:5.“接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下:进程名要求访问的磁道号6.“磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。SCAN算法参考课本第九章。算法模拟框图略。7.附图中的“初始化”工作包括:初始化“请求I/O”表,设置置当前移臂方向;当前磁道号。并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。四、附图五、源程序代码1.操作类packageSCAN;importjava.util.Random;publicclassSCAN_Operation{privateString[][]requestPCB=newString[10][2];//请求进程privateString[][]result=newString[10][2];privateRandomrandom=newRandom();//随机数privateintprocessNum;//请求进程个数//生成随机请求的进程publicvoidRandomRequest(){this.processNum=this.random.nextInt(5)+4;for(inti=0;ithis.processNum;i++){this.requestPCB[i][0]=P+i;this.requestPCB[i][1]=this.random.nextInt(300)+;}for(inti=0;ithis.processNum;i++){for(intj=0;j2;j++){this.result[i][j]=;}}}//对进程进行排序publicvoidsortProcess(){Stringtemp=newString();for(inti=0;ithis.processNum;i++){for(intj=0;jthis.processNum-i-1;j++){if(Integer.parseInt(this.requestPCB[j][1])Integer.parseInt(this.requestPCB[j+1][1])){temp=this.requestPCB[j][0];this.requestPCB[j][0]=this.requestPCB[j+1][0];this.requestPCB[j+1][0]=temp;temp=this.requestPCB[j][1];this.requestPCB[j][1]=this.requestPCB[j+1][1];this.requestPCB[j+1][1]=temp;}}}}//执行方向:1为递增,2为递减publicvoidstepRun(intplace,intdirection){this.sortProcess();intfind=-1;if(direction==1){for(inti=0;ithis.processNum;i++){if(Integer.parseInt(this.requestPCB[i][1])place){find=i;break;}elseif(i==this.processNum-1){find=i;break;}}intj=0;for(inti=find;iprocessNum;i++){this.result[j][0]=this.requestPCB[i][0];this.result[j][1]=this.requestPCB[i][1];j++;}for(inti=find-1;i=0;i--){this.result[j][0]=this.requestPCB[i][0];this.result[j][1]=this.requestPCB[i][1];j++;}}if(direction==2){for(inti=0;ithis.processNum;i++){if(Integer.parseInt(this.requestPCB[i][1])place){find=i;break;}elseif(i==this.processNum-1){find=i;break;}}intj=0;for(inti=find-1;i=0;i--){this.result[j][0]=this.requestPCB[i][0];this.result[j][1]=this.requestPCB[i][1];j++;}for(inti=find;iprocessNum;i++){this.result[j][0]=this.requestPCB[i][0];this.result[j][1]=this.requestPCB[i][1];j++;}}}publicString[][]getRequestPCB(){returnrequestPCB;}publicvoidsetRequestPCB(String[][]requestPCB){this.requestPCB=requestPCB;}publicintgetProcessNum(){returnprocessNum;}publicvoidsetProcessNum(intprocessNum){this.processNum=processNum;}publicString[][]getResult(){returnresult;}publicvoidsetResult(String[][]result){this.result=result;}}2.界面类packageSCAN;importorg.eclipse.swt.widgets.Display;importorg.eclipse.swt.widgets.Shell;importorg.eclipse.swt.widgets.Label;importorg.eclipse.swt.SWT;importorg.eclipse.swt.widgets.MessageBox;importorg.eclipse.swt.widgets.Table;importorg.eclipse.swt.widgets.TableColumn;importorg.eclipse.swt.widgets.Button;importorg.eclipse.swt.widgets.TableItem;importorg.eclipse.swt.widgets.Text;importorg.eclipse.swt.events.SelectionAdapter;importorg.eclipse.swt.events.SelectionEvent;publicclassSCANSWT{protectedShellshell;privateTabletable;privateTexttext;privateTabletable_1;privateMessageBoxmessageBox;privateSCAN_OperationmOperation;/***Launchtheapplication.*@paramargs*/publicstaticvoidmain(String[]args){try{SCANSWTwindow=newSCANSWT();window.open();}catch(Exceptione){e.printStackTrace();}}/***Openthewindow.*/publicvoidopen(){Displaydisplay=Display.getDefault();createContents();shell.open();shell.layout();while(!shell.isDisposed()){if(!display.readAndDispatch()){display.sleep();}}}/***Createcontentsofthewindow.*/protectedvoidcreateContents(){shell=newShell();shell.setSize(507,370);shell.setText(\u78C1\u76D8\u8C03\u5EA6\u7B97\u6CD5);Labellblio=newLabel(shell,SWT.NONE);lblio.setBounds(96,20,86,17);lblio.setText(\u8FDB\u7A0B\u8BF7\u6C42I/O\u8868);table=newTable(shell,SWT.BORDER|SWT.FULL_SELECTION);table.setBounds(10,48,201,274);table.setHeaderVisible(true);table.setLinesVisible(true);TableColumntblclmnNewColumn=newTableColumn(table,SWT.NONE);tblclmnNewColumn.setWidth(70);tblclmnNewColumn.setText(\u8FDB\u7A0B\u540D);TableColumntblclmnNewColumn_1=newTableColumn(table,SWT.CENTER);tblclmnNewColumn_1.setWidth(115);tblclmnNewColumn_1.setText(\u8981\u6C42\u8BBF\u95EE\u7684\u78C1\u9053\u53F7);Labellabel=newLabel(shell,SWT.NONE);label.setBounds(229,15,103,17);label.setText(\u9009\u62E9\u78C1\u5934\u79FB\u52A8\u65B9\u5411);finalButtonbutton=newButton(shell,SWT.RADIO);button.setBounds(338,15,50,17);button.setText(\u9012\u589E);finalButtonbutton_1=newButton(shell,SWT.RADIO);button_1.setBounds(394,15,56,17);button_1.setText(\u9012\u51CF);Labellabel_1=newLabel(s