优先权算法"/>
进程调度之动态优先权算法
首先,我们要了解动态优先权算法。
举一个例子:
进程名 | 到达时间 | 运行时间 | 优先数 |
---|---|---|---|
A | 0 | 4 | 5 |
B | 2 | 2 | 3 |
C | 3 | 5 | 4 |
D | 5 | 2 | 6 |
其中优先数越大优先权越高,每运行一个时间片优先数减3。
既然要模拟动态优先权算法,每个进程的到达时间,运行时间和优先数都应该是随机的,并且满足一些条件:
- 到达时间大于等于0
- 运行时间大于等于1
- 优先数之间的差值与优先数动态调整的数值之间要适当
- 若优先数动态调整的数值远大于优先数之间的差值,则动态优先权算法变成时间片轮转算法
- 若优先数之间的差值远大于优先数动态调整的数值,则动态优先权算法变成先来先服务算法
按理来说应该是先随机出各进程的优先数,再根据优先数之间的差值决定优先数动态调整的数值。
但是为了模拟方便,我们可以先决定优先数动态调整的数值,将其作为参数,再由这个参数随机出各进程的优先数。此段内容对应:
pcs[i].setPriorityValue(dynamicLevel);// 保证动态调整的值合理
运行结果是怎样的
我想创建一个int数组,其中每个元素对应一个时间片,表示该时间片是哪个进程正在运行。
得到这样一个数组之后,其它信息都可以由它推出。
int数组的长度是总时间,总时间为进程需求时间的累加。
对吗?
在整个过程中,总会出现某个时间片内没有进程运行的情况,比如进程最早到达时间是3,那么前3个时间片(如有疑义见显示的统一化)就是没有进程运行的。
所以在程序里需要计算“真正的”总时间。
由于“真正的”总时间需要遍历得到,得到总时间之后才可以创建数组再次遍历计算,所以这一部分相当于遍历了两次。
第一次:
for (int nowTime = 0; nowTime < allTime; nowTime++) {boolean isPosZero = true;for (int i = 0; i < n; i++) {if (pcs[i].timeCost > 0 && nowTime >= pcs[i].arriveTime) {isPosZero = false;}}if (isPosZero) {allTime++;}}
第二次:
for (int nowTime = 0; nowTime < allTime; nowTime++) {int pos = -1;int compare = -dynamicLevel * (nowTime);// 假设初始优先权为正,优先权可以减至负数,该式保证compare的值始终最小for (int i = 0; i < n; i++) {if (pcs[i].timeCost > 0 && nowTime >= pcs[i].arriveTime) {if (compare < pcs[i].priorityValue) {
更多推荐
进程调度之动态优先权算法
发布评论