概要
多核划分概念以及优先级算法可参考博客 多核划分方法-节点优先值计算.
在计算出优先级的前提下根据优先级对任务进行多核调度,任务调度需满足
1.当前任务的执行需要前驱任务已完成才能执行。
2.优先级高的任务先执行。
3.在可抢占的情况下,优先级高的任务可能抢占低优先级任务而先执行。
用例
下图是一个任务依赖图,边表示依赖约束,每个任务名后面的数字是它的执行时间。J5 在时刻 4 释放,其它任务释放时间都是 0. 调度这些任务在两个处理器 P1 和 P2 上执行。两个处理器是共享存储,因此不考虑通信代价。 优先级:按照优先级值计算方法计算后所得到的优先级表如下
J7>J2>J5>J3>J6>J1>J4>J8
调度过程:任务优先级表:J7>J2>J5>J3>J6>J1>J4>J8。
第 1 步: J7 放在 P1 中, 把 J2 放在 P2 中,更新后任务优先级表:J5>J3>J6>J1>J4>J8;
第 2 步:在 J2 执行完之后,J5 还没有释放,因此 J5 不能调度,把 J3 放在P2 中,更新后任务优先级表:J5>J6>J1>J4>J8;
第 3 步:J3 安排好后,应该安排 J6 但 J6 依赖于 J5 执行,因此,把 J1 放在P2 中,更新后任务优先级表:J5>J6>J4>J8;
第 4 步:在 P1 中,J7 执行完毕恰好是时刻 4,此时 J5 释放,因此把 J5 放在P1 中,更新后任务优先级表:J6>J4>J8;
第 5 步:J1 执行完后,安排 J4 在 P2 中执行,J5 执行后,安排 J6 紧跟 J5 在P1 中执行,更新后任务优先级表:J8;
第 6 步:J4 执行后,安排 J8 在 P2 中执行。
整个工作完成时间是 10,即 J6 完成时间。处理器 P1 使用率=1,P2 使用率=0.9. 处理器的划分结果:
P1 处理器: J7,J5,J6
P2 处理器: J2,J3,J1,J4,J8。
本题调度结果见下图:
整个工作完成时间是 10,处理器使用率:P1 为 10/10=1,P2 为 9/10=0.9。
java实现
在代码多核划分方法-节点优先值计算的基础上进行更改,维护前驱列表,并引入Core类模拟核划分动作。
package mulcore;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
public class MulcorePartition
{
static double[][] matr=
{
{
0,0,0,0,0,0,0,0},
{
0,0,1,0,0,1,0,0},
{
0,0,0,1,0,0,0,0},
{
0,0,0,0,0,0,0,0},
{
0,0,0,0,0,1,0,1},
{
0,0,0,0,0,0,0,0},
{
0,0,0,0,0,1,0,1},
{
0,0,0,0,0,0,0,0}
};//导入邻接矩阵,有向无环图
static double[] exeTime= {
3,1,2,2,2,4,4,1};//执行时间表
static double[] relTime= {
0,0,0,0,4,0,0,0};//释放时间表
public class Node
{
int num;
double priority;
boolean priHasSet;
int out;//出度
double doLevel;//任务完成度
LinkedList<Integer> dirOutNode;//直接后继节点
LinkedList<Integer> dirPreNode;//前驱节点
public Node(int num)
{
this.num=num;
priority=0;
priHasSet=false;
out=0;
doLevel=0;
dirOutNode=new LinkedList<Integer>();
dirPreNode=new LinkedList<Integer>();
}
public boolean addOut(int num)
{
return dirOutNode.add(num);
}
public boolean addPre(int num)
{
return dirPreNode.add(num);
}
}
public class Core
{
Node node;//占据核任务
int time;//核有效运行时间
boolean hasNode;
public Core()
{
node=null;
time=0;
hasNode=false;