1. 程式人生 > >設計一個按照優先順序排程演算法實現處理機排程的程式

設計一個按照優先順序排程演算法實現處理機排程的程式

設計一個按照優先順序排程演算法實現處理機排程的程式

一、優先順序排程演算法實現處理機排程的程式設計提示如下:

( 1 ) 假設系統有n個程序,每個程序用一個程序控制塊(PCB)來代表。程序控制塊的格式如下表所示,且引數意義也相同。程序的優先數、到達時間和估計執行時間由使用者程式任意設定,且優先數越低,優先順序越高。排程時,總是選擇優先順序最高的程序執行。
(2)為了排程方便,設計一個指標指向就緒佇列的第一個到達程序。另外再設一個當前執行程序指標,指向當前正執行的程序。
(3)處理機排程時,總是選擇已經到達佇列的優先順序最高的程序執行。為了採用動態優先順序排程,程序每執行一次,其優先順序就減1。
(4)由於本題目是模擬實驗,所以對被選中的程序並不實際啟動執行,而只是執行如下操作:
1)優先數加1;
2)估計執行時間減1;
3)輸出當前執行程序的名字。
用這三個操作來模擬程序的一次執行。
(5)程序執行一次後,應判斷該程序的剩餘執行時間是否為0,若不為0,且其優先順序低於就緒佇列的其他程序的優先順序,則選擇一個高優先順序程序搶佔CPU執行,若該程序的剩餘執行時間為0,則將該程序的狀態置為完成狀態“C”,並撤出就緒佇列。
(6)若就緒佇列不為空,則重複上述的步驟(4)和(5)直到所有程序都執行完為止。
(7)在所設計的排程程式中,應包含顯示或列印語句,以便顯示或列印每次選中程序的名稱及執行一次後程序的變化以及就緒佇列中各程序排隊情況。

二、程式中使用的資料結構及主要符號說明

在這裡插入圖片描述

模擬PCB程序控制塊設定瞭如上資料結構,其中name是程序名,arrivalTime是到達時間,priorityNum是優先順序數,runTime是執行時間,status是程序狀態。
其中:
name為使用者程式自定義的
priorityNum為1~10的隨機數
arrivalTime和runTime為1~5的隨機數
status的值有三種:Ready,Working,End,分別代表就緒狀態,執行狀態和終止狀態。

三、程式流程圖

在這裡插入圖片描述

四、參考程式碼

PCB類:

package pcb;

public class PCB {
	private String name;//程序名字
	private int arrivalTime;//到達時間,1~5的隨機數
	private int priorityNum;//優先順序,1~10的隨機數
	private int runTime;//執行時間,1~5的隨機數
	private String status = "Ready";//程序狀態

	public PCB(String name) {
		super();
		this.name = name;
		this.setArrivalTime(arrivalTime);
		this.setPriorityNum(priorityNum);
		this.setRunTime(runTime);
		//this.printInformation();	
	}
	
	//列印PCB資訊
	public void printInformation() {
		System.out.println(this.getName()+"\t"+this.getArrivalTime()+"\t"+
				this.getRunTime()+"\t"+this.getPriorityNum()+"\t"+this.getStatus());
	}

	

//	public PCB(String name, int arrivalTime, int priorityNum, int runTime) {
//	super();
//	this.name = name;
//	this.arrivalTime = arrivalTime;
//	this.priorityNum = priorityNum;
//	this.runTime = runTime;
//	this.printInformation();
//}



	//程序執行
	public void run() {		
		this.priorityNum++;
		this.runTime--;		
	}

	public String getName() {
		return name;
	}

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

	public int getArrivalTime() {
		return arrivalTime;
	}

	public void setArrivalTime(int arrivalTime) {
		arrivalTime = (int) (Math.random()*5+1);
		this.arrivalTime = arrivalTime;
	}

	public int getPriorityNum() {
		return priorityNum;
	}

	public void setPriorityNum(int priorityNum) {
		priorityNum = (int) (Math.random()*10+1);
		this.priorityNum = priorityNum;
	}

	public int getRunTime() {
		return runTime;
	}

	public void setRunTime(int runTime) {
		runTime = (int) (Math.random()*5+1);
		this.runTime = runTime;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}	
}

Priority 類:

package pcb;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class Priority {
	public static void getMax(Queue<PCB> queue) {
		//找出優先順序最高(優先順序數最小)的程序
		int minPriorityNum = 100;
		int minArrivalTime = 100;
		for(PCB q : queue ) {
			if(q.getPriorityNum() < minPriorityNum) {
				minPriorityNum = q.getPriorityNum();	
			}			
		}
		//找出優先順序最高且到達時間最早的程序
		for(PCB q : queue ) {
			if(q.getPriorityNum() == minPriorityNum && q.getArrivalTime() < minArrivalTime) {
				minArrivalTime = q.getArrivalTime();
			}
		}
		
		PCB first = queue.peek();
		for(int i = 0;i < queue.size();i++) {
			while(queue.peek().getPriorityNum() > minPriorityNum) {
				queue.offer(queue.peek());
				queue.poll();			
			}
			PCB q =  ((LinkedList<PCB>) queue).get(i);
			
			if(!q.equals(first)) {				
				if((q.getPriorityNum() == queue.peek().getPriorityNum()) && q.getArrivalTime() < queue.peek().getArrivalTime()) {					
					while(queue.peek().getArrivalTime() != minArrivalTime) {
						queue.offer(queue.peek());
						queue.remove(queue.peek());
						queue.remove(0);
						//i--;
					}										
				}else {						
					continue;
				}				
			}else {
				continue;
			}
		}				
	}
	
	public static void main(String[] args) {
		System.out.println("名字\t"+"到達時間\t"+"執行時間\t"+"優先順序數\t"+"狀態");
		Queue<PCB> queue = new LinkedList<PCB>();
//		queue.offer(new PCB("a1",1,9,9));
//		queue.offer(new PCB("a2",2,5,10));	
//		queue.offer(new PCB("a3",5,7,10));
//		queue.offer(new PCB("a4",2,4,6));
		queue.offer(new PCB("a1"));
		queue.offer(new PCB("a2"));	
		queue.offer(new PCB("a3"));
//		queue.offer(new PCB("a4"));
//		queue.offer(new PCB("a5"));
//		queue.offer(new PCB("a6"));	
//		queue.offer(new PCB("a7"));
//		queue.offer(new PCB("a8"));
//		queue.offer(new PCB("a9"));
//		queue.offer(new PCB("a10"));	
//		queue.offer(new PCB("a11"));
//		queue.offer(new PCB("a12"));
//		queue.offer(new PCB("a13"));
//		queue.offer(new PCB("a14"));	
//		queue.offer(new PCB("a15"));
//		queue.offer(new PCB("a16"));
		
				
//		System.out.println("=======================================");
		
		while(!queue.isEmpty()) {
			//把優先順序最高(優先順序數小)的程序調到隊首
			if(queue.size() > 1) {
				getMax(queue);			
			}
			
			if(!queue.isEmpty()) {
				//遍歷佇列,設定程序狀態
				for(PCB q : queue) {
					if(q.equals(queue.peek())) {
						//隊首
						q.setStatus("Working");
					}else {
						//非隊首
						if(q.getStatus().equals("Working")) {
							q.setStatus("Ready");
						}												
					}
					//列印資訊
					q.printInformation();
				}
				//程序執行
				queue.peek().run();
			}
			
			for(PCB q : queue) {
				if(q.getRunTime() == 0) {
					q.setStatus("End");					
				}
												
				if(q.getStatus().equals("End")) {
					System.out.println();
					//列印資訊
					q.printInformation();
					System.out.print("==============="+q.getName()+"程序結束================");
					queue.poll();
					break;
				}			
			}			
			System.out.println();	
			}				
		}		
	}


五、執行結果

1.第一次執行結果:

在這裡插入圖片描述

2.第二次執行結果:

在這裡插入圖片描述
在這裡插入圖片描述

六、總結

本實驗是模擬優先順序排程演算法實現處理機排程的程式,實驗中假設所有建立的程序都已在記憶體中,即一個等待執行的佇列中,每次都將優先順序最高的程序放到隊首,然後每執行一次程序就下降一個優先權再進行優先權比較 ,如果優先順序相同則比較到達時間,將優先順序最高且到達時間最早的程序放到隊首。若出現優先權更高的程序,則立即停止當前執行,並將處理機分配給新到的優先權最高的程序。
本程式測試過程中加入了32個程序,程式執行穩定且結果正確,說明了程式的魯棒性較好。