1. 程式人生 > >程序排程三種演算法的實現(FCFS,SJF,RR)

程序排程三種演算法的實現(FCFS,SJF,RR)

作業系統的又一次作業,模擬程序排程。這次用JAVA 實現了三種排程演算法,包括FCFS(先到先服務),SJF(短作業優先),RR(輪轉排程演算法)。
eclipse匯入了阿里的一個jar包,用於實現josn資料的轉換。
jar包
廢話就不多說了,直接上程式碼吧。

no.1

package com.box.process;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.URL
; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.box.process.tools.PCB; public class MainRun { static int allTime=0; public static void main(String[] args) { while(true) { Scanner scanner=new Scanner(System.in
); String processMessage=loadProcess(); List<PCB> pcbs=new ArrayList<>(); JSONArray jsonArray=JSONArray.parseArray(processMessage); pcbs=JSONArray2ObjectList(jsonArray); System.out.println("請選擇排程方法"); System.out.println("1.優先數演算法 2.時間片輪轉演算法 3.短作業優先演算法 4.退出"
); int choose = Integer.parseInt(scanner.next()); if(choose==4) break; allTime = getAllTime(pcbs); switch (choose) { case 1: Cls(); priority(pcbs); System.out.println(); System.out.println(); break; case 2: Cls(); changeByTime(pcbs); System.out.println(); System.out.println(); break; case 3: Cls(); shortTaskFrist(pcbs); System.out.println(); System.out.println(); break; default: return; } } } //返回所有程序執行時間的總和 private static int getAllTime(List<PCB> pcbs) { int allTime=0; for(PCB pcb:pcbs){ allTime+=pcb.getRunTime(); } return allTime; } private static void changeByTime(List<PCB> pcbs) { List<String> queueList=new ArrayList<>(); List<PCB> oldPcbs=new ArrayList<>(); oldPcbs=pcbs; Scanner scanner=new Scanner(System.in); System.out.println("請輸入時間片大小:"); int time=scanner.nextInt(); //原始資訊 System.out.println("原始資訊:"); System.out.println("\n程序名:\t"+"到達時間:\t"+"執行時間:\t"+"優先順序:\t"); for(int i=0;i<pcbs.size();i++){ System.out.print(pcbs.get(i).getName()+"\t"); System.out.print(pcbs.get(i).getStartTime()+"\t"); System.out.print(pcbs.get(i).getRunTime()+"\t"); System.out.print(pcbs.get(i).getPriority()+"\t"); System.out.println(); } System.out.println(); System.out.println("一個週期內,排程佇列中每秒執行的程序如下:"); //以一個時間片時間到或者在時間片內process執行完成,為一次迴圈進行。 //直至所有process皆執行結束 for(int i=0;i<allTime;i++) { PCB current=null; int k=0; for(int j=0;j<pcbs.size();j++){ PCB pcb=pcbs.get(j); if(pcb.getIsOver()==false){ if(pcb.getStartTime()<=i){ if(current==null){ current=pcb; k=j; break; } } } } pcbs.get(k).decrease();//當前程序的執行時間-1 queueList.add(current.getName()); System.out.print(current.getName()); i++;//當前時間增加 //該時間片內,該程序的運轉情況,若提前結束,則跳出。時間片到,但未結束,則中止當前程序,進行下一程序。 int j=1; for(j=1;j<time;j++){ if(pcbs.get(k).getIsOver()==false){ pcbs.get(k).decrease(); queueList.add(current.getName()); System.out.print(current.getName()); i++;//時間增加 } } //當前程序未結束,但時間片到時,重新調整所有程序的就緒佇列。 //各個程序按照原來佇列依次向前,中止程序放於佇列最後(建立一個新的佇列list,並賦值給pcbs) if(j==time&&pcbs.get(k).getIsOver()==false){ List<PCB> newPcbs=new ArrayList<>(); for(int n=0;n<pcbs.size();n++){ if(n!=k&&pcbs.get(n).getIsOver()==false){ newPcbs.add(pcbs.get(n)); } } newPcbs.add(pcbs.get(k)); pcbs=newPcbs; } } //等待時間=程序開始執行時間-程序到達時間 //週轉時間=程序最後一次執行時間-開始執行時間+1 pcbs=oldPcbs; System.out.println(); System.out.println("\n程序名:\t"+"等待時間:\t"+"週轉時間:\t"); for(int i=0;i<pcbs.size();i++){ System.out.print(pcbs.get(i).getName()+"\t"); for(int k=0;k<queueList.size();k++){ if(pcbs.get(i).getName().equals(queueList.get(k))){ System.out.print(k-pcbs.get(i).getStartTime()); System.out.print("\t"); break; } } for(int k=queueList.size()-1;k>=0;k--){ if(pcbs.get(i).getName().equals(queueList.get(k))){ System.out.print((k-pcbs.get(i).getStartTime())+1); System.out.print("\t"); break; } } System.out.println(); } } private static void shortTaskFrist(List<PCB> pcbs) { List<String> queueList=new ArrayList<>(); System.out.println("排程佇列中每秒執行的程序如下:"); //原始資訊 System.out.println("原始資訊:"); System.out.println("\n程序名:\t"+"到達時間:\t"+"執行時間:\t"+"優先順序:\t"); for(int i=0;i<pcbs.size();i++){ System.out.print(pcbs.get(i).getName()+"\t"); System.out.print(pcbs.get(i).getStartTime()+"\t"); System.out.print(pcbs.get(i).getRunTime()+"\t"); System.out.print(pcbs.get(i).getPriority()+"\t"); System.out.println(); } System.out.println(); //1秒迴圈一次,每次執行執行時間最短的process,且該process的RunTime-1 for(int i=0;i<allTime;i++){ PCB current=null; int k=0; //find the shortest process //i表示當前時間 for(int j=0;j<pcbs.size();j++){ PCB pcb=pcbs.get(j); if(pcb.getIsOver()==false){ if(pcb.getStartTime()<=i){ if(current==null){ current=pcb; }else{ if (current.getRunTime()>pcb.getRunTime()){ current=pcb; k=j; } } } } } pcbs.get(k).decrease(); queueList.add(current.getName()); System.out.print(current.getName()); } System.out.println(); System.out.println("\n程序名:\t"+"等待時間:\t"+"週轉時間:\t"); for(int i=0;i<pcbs.size();i++){ System.out.print(pcbs.get(i).getName()+"\t"); for(int k=0;k<queueList.size();k++){ if(pcbs.get(i).getName().equals(queueList.get(k))){ System.out.print(k-pcbs.get(i).getStartTime()); System.out.print("\t"); break; } } for(int k=queueList.size()-1;k>=0;k--){ if(pcbs.get(i).getName().equals(queueList.get(k))){ System.out.print((k-pcbs.get(i).getStartTime())+1); System.out.print("\t"); break; } } System.out.println(); } } private static void priority(List<PCB> pcbs) { List<String> queueList=new ArrayList<>(); //原始資訊 System.out.println("原始資訊:"); System.out.println("\n程序名:\t"+"到達時間:\t"+"執行時間:\t"+"優先順序:\t"); for(int i=0;i<pcbs.size();i++){ System.out.print(pcbs.get(i).getName()+"\t"); System.out.print(pcbs.get(i).getStartTime()+"\t"); System.out.print(pcbs.get(i).getRunTime()+"\t"); System.out.print(pcbs.get(i).getPriority()+"\t"); System.out.println(); } System.out.println(); System.out.println("排程佇列中每秒執行的程序如下:"); //1秒迴圈一次,每次執行優先順序最高的process,且該process的RunTime-1 for(int i=0;i<allTime;i++){ PCB current=null; int k=0; //find the highest Priority process //i表示當前時間 for(int j=0;j<pcbs.size();j++){ PCB pcb=pcbs.get(j); if(pcb.getIsOver()==false){ if(pcb.getStartTime()<=i){ if(current==null){ current=pcb; }else{ if (current.getPriority()>pcb.getPriority()){ current=pcb; k=j; } } } } } pcbs.get(k).decrease(); queueList.add(current.getName()); System.out.print(current.getName()); } System.out.println(); System.out.println("\n程序名:\t"+"等待時間:\t"+"週轉時間:\t"); for(int i=0;i<pcbs.size();i++){ System.out.print(pcbs.get(i).getName()+"\t"); for(int k=0;k<queueList.size();k++){ if(pcbs.get(i).getName().equals(queueList.get(k))){ System.out.print(k-pcbs.get(i).getStartTime()); System.out.print("\t"); break; } } for(int k=queueList.size()-1;k>=0;k--){ if(pcbs.get(i).getName().equals(queueList.get(k))){ System.out.print((k-pcbs.get(i).getStartTime())+1); System.out.print("\t"); break; } } System.out.println(); } } //利用阿里的jar包,將JSONArray內容複製給List<PCB>,並返回 private static List<PCB> JSONArray2ObjectList(JSONArray jsonArray) { List<PCB> pcbs=new ArrayList<>(); for(int i=0;i<jsonArray.size();i++){ JSONObject jsonObject=jsonArray.getJSONObject(i); PCB pcb=new PCB(); pcb.Json2Object(jsonObject); pcbs.add(pcb); } return pcbs; } //匯入JOB1檔案到String字串,即將各個process的內容匯入 private static String loadProcess() { URL xmlpath=MainRun.class.getClassLoader().getResource(""); String encoding="utf-8"; try { File file=new File(xmlpath.toString().replace("file:/", "")+"com/box/process/JOB1.txt"); if(file.isFile() && file.exists()){ InputStreamReader read = new InputStreamReader( new FileInputStream(file),encoding); BufferedReader bufferedReader = new BufferedReader(read); StringBuffer buffer=new StringBuffer(); String lineTxt = null; while((lineTxt = bufferedReader.readLine()) != null){ buffer.append(lineTxt); } String message=buffer.toString(); read.close(); return message; }else{ System.out.println("開啟檔案失敗"); } } catch (Exception e) { System.out.println("載入檔案失敗"); e.printStackTrace(); } return null; } //清屏 public static void Cls() { for(int i=0;i<30;i++) { System.out.println(); } } }

no.2

package com.box.process.tools;

import com.alibaba.fastjson.JSONObject;

public class PCB {
    private int runTime;  //執行時間
    private  int priority;   //優先順序
    private  String name; //程序名稱
    private boolean isOver; //是否執行結束
    private int startTime;  //開始執行時間


    public int getRunTime() {
        return runTime;
    }

    public void setRunTime(int runTime) {
        this.runTime = runTime;
    }


    public int getPriority() {
        return priority;
    }



    public void setPriority(int priority) {
        this.priority = priority;
    }



    public String getName() {
        return name;
    }



    public void setName(String name) {
        this.name = name;
    }



    public boolean getIsOver() {
        return isOver;
    }


    public void setIsOver(boolean isOver) {
        this.isOver = isOver;
    }


    public int getStartTime() {
        return startTime;
    }

    public void setStartTime(int startTime) {
        this.startTime = startTime;
    }

    public void Json2Object(JSONObject jsonObject) {
        setName(jsonObject.getString("name"));
        setStartTime(jsonObject.getInteger("startTime"));
        setIsOver(jsonObject.getBooleanValue("isOver"));
        setPriority(jsonObject.getIntValue("priority"));
        setRunTime(jsonObject.getIntValue("runTime"));
    }


    public void decrease() {
         runTime--;
         if(runTime<=0){
             isOver=true;
         }
    }


}

文字內容:

 [
        {
            "name": "P1",
            "startTime": 0,
            "runTime": 7,
            "priority": 5,
            "isOver":false
        },
        {
            "name": "P2",
            "startTime": 1,
            "runTime": 1,
            "priority": 1,
             "isOver":false
        },
        {
            "name": "P3",
            "startTime": 1,
            "runTime": 3,
            "priority": 4,
            "is_over":false
        },
        {
            "name": "P4",
            "startTime": 2,
            "runTime": 5,
            "priority": 3,
             "isOver":false
        },
        {
            "name": "P5",
            "startTime": 4,
            "runTime": 4,
            "priority": 2,
            "isOver":false
        }
    ]

注:所參考的部落格資料,因為當時沒有記錄,現在寫的時候返回去怎麼也找不見了,所以前輩看見了,直接私聊我。