程序排程三種演算法的實現(FCFS,SJF,RR)
阿新 • • 發佈:2019-02-11
作業系統的又一次作業,模擬程序排程。這次用JAVA 實現了三種排程演算法,包括FCFS(先到先服務),SJF(短作業優先),RR(輪轉排程演算法)。
eclipse匯入了阿里的一個jar包,用於實現josn資料的轉換。
廢話就不多說了,直接上程式碼吧。
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
}
]
注:所參考的部落格資料,因為當時沒有記錄,現在寫的時候返回去怎麼也找不見了,所以前輩看見了,直接私聊我。