Round-robin 算法

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 queue = new LinkedList();
		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.

你可能感兴趣的:(Java,算法&数据结构)