操作系统高响应比优先调度算法模拟实验
從輸入井中選擇作業(yè)讀入內(nèi)存,使其獲得處理器,得到運(yùn)行的機(jī)會(huì),即為作業(yè)調(diào)度。輸入井中的作業(yè)用“作業(yè)控制塊”(JCB)標(biāo)識(shí),為了進(jìn)行作業(yè)調(diào)度,將作業(yè)控制塊組成一個(gè)隊(duì)列,這個(gè)隊(duì)列稱為后備隊(duì)列。
模擬實(shí)驗(yàn)中沒有實(shí)際作業(yè),作業(yè)控制塊中的信息內(nèi)容只使用了模擬實(shí)驗(yàn)中需要的數(shù)據(jù)。作業(yè)控制塊中包括作業(yè)名、作業(yè)大小、所需打印機(jī)臺(tái)數(shù)、所需磁帶機(jī)數(shù)量、作業(yè)估計(jì)執(zhí)行時(shí)間、作業(yè)等待時(shí)間、指向下一個(gè)作業(yè)控制塊的指針等內(nèi)容。將作業(yè)控制塊組成一個(gè)隊(duì)列,實(shí)驗(yàn)中采用動(dòng)態(tài)鏈表的方式模擬作業(yè)的后備隊(duì)列。作業(yè)控制塊采用結(jié)構(gòu)型數(shù)據(jù)模擬。
模擬實(shí)驗(yàn)中,主存采用可移動(dòng)的可變分區(qū)管理方法,即只要主存空閑區(qū)總和比作業(yè)大就可以滿足作業(yè)對(duì)主存的需求。對(duì)打印機(jī)和磁帶機(jī)這兩種獨(dú)占設(shè)備采用靜態(tài)分配法,即作業(yè)執(zhí)行前必須獲得所需資源,并且執(zhí)行完才歸還。
實(shí)驗(yàn)中作業(yè)的調(diào)度采用響應(yīng)比高者優(yōu)先算法。響應(yīng)比為作業(yè)的等待時(shí)間和作業(yè)估計(jì)執(zhí)行時(shí)間之比。首先計(jì)算出輸入井中滿足條件的作業(yè)的響應(yīng)比,從中選擇響應(yīng)比最高的一個(gè)作業(yè)裝入主存儲(chǔ)器,分配資源。由于是模擬實(shí)驗(yàn),可將作業(yè)控制塊出隊(duì)裝入主存儲(chǔ)器的工作用輸出作業(yè)名模擬,同時(shí)修改系統(tǒng)的資源數(shù)量。
package OS;import java.util.Arrays; import java.util.Scanner;public class ProcessSchAlg {public static void main(String[] args) {Scanner scn = new Scanner(System.in);int num=Integer.valueOf(scn.nextLine());String initMessage[]=new String[num];for(int i=0;i<initMessage.length;i++) initMessage[i]=scn.nextLine();List Queue=new List(initMessage);Queue.show(0);for(int i=0;i<num;i++) Queue.show(deal(Queue.getProcess()));}public static int deal(Process p){if(p.large>5){System.out.println("The RAM is not enough,Process "+p.name+" require failed!!!");return 0;}if(p.printer>5){System.out.println("The printer is not enough,Process "+p.name+" require failed!!!");return 0;}if(p.tape>5){System.out.println("The tape is not enough,Process "+p.name+" require failed!!!");return 0;}System.out.println("Process "+p.name+" is under operating...");System.out.println("Process "+p.name+" operated successfully!");return p.needTime;} }class List{Process head;Process tail;public List(){head=null;tail=null;}public List(String[] initMessage){head=null;tail=null;for(int i=0;i<initMessage.length;i++) {Process temp =new Process(initMessage[i]);insert(temp);}}public void insert(Process temp){if(head==null){head=temp;head.next=tail;}else if(head.next==null){tail=temp;head.next=tail;}else {tail.next=temp;tail=tail.next;}}public Process getProcess(){double[] lev= new double[10];int index=0;Process p=head;while(p!=null){lev[index]=p.level;index++;p=p.next;}Arrays.sort(lev);p=head;if(p==null)return null;else{if(p.next==null){Process t=new Process();t=head;head=null;return t;}else{Process q=head;if(p.level==lev[9]){Process t=new Process();t=head;head=head.next;return t;}p=p.next;while(p!=null){if(p.level==lev[9]){q.next=p.next;return p;}}}}return null;}public void show(int time){Process p=head;if(p==null) System.out.println("Operate Over!");else {System.out.println("name "+"l\t"+"p\t"+"t\t"+"nT\t"+"wT\t"+"lev");while (p != null) {p.waitTime+=time;p.print();p = p.next;}System.out.println();}} }class Process{String name;int large;int printer;int tape;int needTime;int waitTime;double level;Process next;public Process(){}public Process(String s) {int[] num= new int[4];int index=0;for(int i=0;i<s.length();i++){if(s.charAt(i)==' ') {num[index]=i;index++;}}this.name=s.substring(0,num[0]);this.large=Integer.valueOf(s.substring(num[0]+1,num[1]));this.printer=Integer.valueOf(s.substring(num[1]+1,num[2]));this.tape=Integer.valueOf(s.substring(num[2]+1,num[3]));this.needTime=Integer.valueOf(s.substring(num[3]+1));}public void print(){level=1+((1.0*waitTime)/needTime);System.out.print(name+"\t"+large+"\t"+printer+"\t"+tape+"\t"+needTime+"\t"+waitTime+"\t");System.out.printf("%.2f",level);System.out.println();} }運(yùn)行結(jié)果示范:
總結(jié)
以上是生活随笔為你收集整理的操作系统高响应比优先调度算法模拟实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql盲注 解决_解决SQL盲注和跨站脚
- 下一篇: java remove all_如何使用