Round-robin 演算法

殷老實發表於2016-10-08

Round-robin 是一種使用在 程式 和 網路分配 計算中的演算法。 

以 程式分配為例:


假設我們的time slot ( 單次執行程式的最長時間) 是100 ms,  如果 job1 一共需要消耗250 ms來執行, 那麼 round-robin 分配器就會暫停 job1 在其執行100 ms之後, 然後分配給其他的程式, 並且將 job1 剩下的內容放到佇列中排隊,直到 job1 執行結束。


Process name Arrival time Execute time
P0 0 250
P1 50 170
P2 130 75
P3 190 100
P4 210 130
P5 350 50
以上的圖中表示 程式 0 - 5 的到達時間和執行完成的總時間。


執行佇列如下。


時間 佇列 解釋
0 P0 時間0的時候, P0 到達
100 P1 P0 當執行100ms的時候,應該分配給下一個程式,P1在0~100內到達,P0剩下150 ms需要執行
200 P0 P2 P3 P1 當執行200ms的時候,新程式 P2 和 P3 在100~200內 到達,P1 剩下70ms,
300 P2 P3 P1 P4 P0 當執行300ms的時候,新程式P4 在200~300 內到達,P0 剩下 50ms
375 P3 P1 P4 P0 P5 當從300ms到375ms的時候,程式P2完成,那麼我們將結束它,進而按照佇列繼續工作,注意把在300 ~ 375內到達的P5放進程式佇列中
475 P1 P4 P0 P5 P3結束, 迴歸下佇列中的程式。P1 70ms, P4 130ms  P0 50ms P5 50ms 
545 P4 P0 P5 P1結束
645 P0 P5 P4 P4剩下30ms
695 P5 P4 P0結束
745 P4 P5結束
775   P4結束
   


public static void RoundRobin_Algo(int[] arrTime, int[] exeTime, int timeSlot) {
		if (arrTime == null || exeTime == null || arrTime.length != exeTime.length) {
			System.out.println("Error!");
		}
		
		Queue<process> queue = new LinkedList<process>();
		int index = 0;	
		int totalWaitTime = 0;		//所有程式的等待總時間
		int currentTime = 0;		//當前時間
		int visitedTimes = 0;		//CPU訪問次數
		
		while (!queue.isEmpty() || index < arrTime.length) {
			if (!queue.isEmpty()) {
				visitedTimes ++;
				process tempP = queue.poll();
				//waiting time in total
				totalWaitTime += currentTime - tempP.arrTime;
				//update the currentTime
				currentTime += Math.min(tempP.exeTime, timeSlot);
				
				//add the process which arrived before the end of this process finished.
				for (; index < arrTime.length && arrTime[index] < currentTime; index++) {
					queue.add(new process(arrTime[index], exeTime[index]));
				}
				
				//add the rest of current process into process queue
				if (tempP.exeTime > timeSlot) {
					queue.add(new process(currentTime, tempP.exeTime - timeSlot));
				}
				
			} else {
				queue.add(new process(arrTime[index], exeTime[index]));
				currentTime = arrTime[index];
				index++;
				visitedTimes ++;
			}
		}
		System.out.println("Total wait time among the process: " + totalWaitTime);
		System.out.println("Total CPU visited times: " + visitedTimes);
	}


Let me know, If you found any issues.

相關文章