动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3,cpu时间加1,总时间减1.
所有想说的都在代码里
PCB.java
package process;
public class PCB
{
public int id;
public int pri;
public int cpuTime;
public int allTime;
public String state;
PCB(int id,int pri,int cpuTime,int allTime,String state)
{
this.id = id;
this.pri = pri;
this.cpuTime = cpuTime;
this.allTime = allTime;
this.state = state;
}
public void print()
{
System.out.print("ID:"+id+"\t");
System.out.print(" 优先级:"+pri+"\t");
System.out.print(" CPU时间:"+cpuTime+"\t");
System.out.print(" 总时间:"+allTime+"\t");
System.out.print(" 状态:"+state+"\n");
}
}
run.java
package process;
import java.util.Arrays;
public class run {
run(){}
public void start(PCB test[])
{
System.out.println("初始时:");
for(int i = 0;i < test.length;i++)
test[i].print();//打印
int i = 1;
while(true)
{
System.out.println("第"+i+"次:");
i++;
Round_Robin(test); //调用时间片轮转法
for(int j = 0;j < test.length;j++)
test[j].print();//再次打印
int over = 0;//用于记录已经dead的进程数
for(int k = 0;k < test.length;k++)
if(test[k].allTime == 0)
over++;
if(over == test.length)//如果进程全部dead
break;//那么退出循环,程序结束
}
}
private void Round_Robin(PCB test[])
{
/*这里需要特别注意,对优先级进行排序的时候,dead的进程的优先级是不能参与排序的
*因此这里先确定了存活的进程数
*然后只将存活的进程的优先级放入一个数组中进行排序
*最后通过对比得到最大的优先级是哪一个进程的,对此进程进行操作
*/
int num = 0;//确定存活的进程数
for(int i = 0;i < test.length;i++)
{
if(test[i].allTime > 0)//如果总时间大于0,num++
num++;
}
int k=0;
int a[] = new int[num];//初始化num个长度的数组用于存放进程优先级
for(int j = 0;j<test.length;j++)
{
if(test[j].allTime > 0){
a[k] = test[j].pri;//如果总时间大于0,就把优先级存到数组a里
k++;
}
}
Arrays.sort(a);//对优先级进行排序 小->大
for(int l = 0;l < test.length;l++)
{
if(test[l].pri == a[a.length-1] && test[l].allTime > 0)
{//优先级最大的那一个进程
test[l].pri -=3;
test[l].cpuTime++;
test[l].allTime--;
if(test[l].allTime == 0)
test[l].state = "dead";
}
}
}
}
test.java
package process;
public class test{
public static void main(String[] args) {
PCB test[] = new PCB[5];//初始化5个对象,即测试5个进程
test[0] = new PCB(0,9,0,3,"ready");
test[1] = new PCB(1,38,0,2,"ready");
test[2] = new PCB(2,30,0,6,"ready");
test[3] = new PCB(3,29,0,3,"ready");
test[4] = new PCB(4,0,0,4,"ready");
// test[5] = new PCB(5,90,0,100,"ready");
run run = new run();
run.start(test);
}
}
结果
初始时:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:38 CPU时间:0 总时间:2 状态:ready
ID:2 优先级:30 CPU时间:0 总时间:6 状态:ready
ID:3 优先级:29 CPU时间:0 总时间:3 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第1次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:35 CPU时间:1 总时间:1 状态:ready
ID:2 优先级:30 CPU时间:0 总时间:6 状态:ready
ID:3 优先级:29 CPU时间:0 总时间:3 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第2次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:30 CPU时间:0 总时间:6 状态:ready
ID:3 优先级:29 CPU时间:0 总时间:3 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第3次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:27 CPU时间:1 总时间:5 状态:ready
ID:3 优先级:29 CPU时间:0 总时间:3 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第4次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:27 CPU时间:1 总时间:5 状态:ready
ID:3 优先级:26 CPU时间:1 总时间:2 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第5次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:24 CPU时间:2 总时间:4 状态:ready
ID:3 优先级:26 CPU时间:1 总时间:2 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第6次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:24 CPU时间:2 总时间:4 状态:ready
ID:3 优先级:23 CPU时间:2 总时间:1 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第7次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:21 CPU时间:3 总时间:3 状态:ready
ID:3 优先级:23 CPU时间:2 总时间:1 状态:ready
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第8次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:21 CPU时间:3 总时间:3 状态:ready
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第9次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:18 CPU时间:4 总时间:2 状态:ready
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第10次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:15 CPU时间:5 总时间:1 状态:ready
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第11次:
ID:0 优先级:9 CPU时间:0 总时间:3 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第12次:
ID:0 优先级:6 CPU时间:1 总时间:2 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第13次:
ID:0 优先级:3 CPU时间:2 总时间:1 状态:ready
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第14次:
ID:0 优先级:0 CPU时间:3 总时间:0 状态:dead
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:0 CPU时间:0 总时间:4 状态:ready
第15次:
ID:0 优先级:0 CPU时间:3 总时间:0 状态:dead
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:-3 CPU时间:1 总时间:3 状态:ready
第16次:
ID:0 优先级:0 CPU时间:3 总时间:0 状态:dead
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:-6 CPU时间:2 总时间:2 状态:ready
第17次:
ID:0 优先级:0 CPU时间:3 总时间:0 状态:dead
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:-9 CPU时间:3 总时间:1 状态:ready
第18次:
ID:0 优先级:0 CPU时间:3 总时间:0 状态:dead
ID:1 优先级:32 CPU时间:2 总时间:0 状态:dead
ID:2 优先级:12 CPU时间:6 总时间:0 状态:dead
ID:3 优先级:20 CPU时间:3 总时间:0 状态:dead
ID:4 优先级:-12 CPU时间:4 总时间:0 状态:dead
总体实现还是较为简单的,但缺点也很明显,使用的循环太多,性能必然会下降。