多核划分方法-优先级多核划分

依据静态优先级的多核划分

概要

多核划分概念以及优先级算法可参考博客 多核划分方法-节点优先值计算.
在计算出优先级的前提下根据优先级对任务进行多核调度,任务调度需满足
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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值