加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
task_scheduling.m 5.84 KB
一键复制 编辑 原始数据 按行查看 历史
Wintery 提交于 2022-05-23 16:12 . ywh made
function [finish,time_span]=task_scheduling(task,execution_time,task_allocation,instance_id,task_num,task_out,task_in)
start(1:task_num)=0;
finish(1:task_num)=0;
idle=[0 0 0 0]; %表示每个服务器的空闲时刻,终端的空闲时刻
ready(1) = 1;
ready(2:task_num) = 0;
EST(1:task_num)=0;
%waste_time=0;
input=0; %输入方,0表示终端,1表示云服务器1,2表示边缘服务器2,3表示边缘服务器3
input_task=0; %输入方任务id
translate_rate=[0.01,0.005]; %分别表示WAN和LAN的传输速度(单位数据传输需要的时间),对应100Mbps和200Mbps
time_span=[0 0 0 0]; %三种消耗服务器,终端消耗时间
accomplish_num=0;
while(any(ready))
%% 找到此次卸载的任务
ready_task=find(ready==1); %准备序列
n = length(ready_task(:)) ; %准备序列元素个数
temp_est = EST(ready_task(1) ) ; %通过EST找到优先级最高的任务
temp_task = ready_task(1);
if n>1
for c=1:n %找到空闲情况下EST最小
if EST(ready_task(c))<temp_est
temp_est = EST(ready_task(c));
temp_task = ready_task(c); %最早开始的任务
end
end
end
%% 首个任务,考虑传输时间
if(input_task==0)
task_mem=task_in;
if(task_allocation(temp_task)~=0) %非本地卸载
if(instance_id(task_allocation(temp_task))==1) %终端到云
translate_time=task_mem*translate_rate(1);
elseif(instance_id(task_allocation(temp_task))~=1) %终端到边缘
translate_time=task_mem*translate_rate(2);
end
else
translate_time=0;
end
EST(temp_task)=translate_time;
temp_est=EST(temp_task);
end
%% 表示卸载至本地
if task_allocation(temp_task)==0
start(temp_task)=max(idle(4),temp_est);
if (start(temp_task)> idle(4))&&(not(idle(4))==0) %计算浪费的时间
%waste_time=waste_time+(start(temp_task)-idle(4));
time_span(4)=time_span(4)+(start(temp_task)-idle(4));
%time_span需要加上waste_time
end
finish(temp_task)=start(temp_task)+execution_time(temp_task,4);
idle(4)=finish(temp_task); %完成标志队列
time_span(4)=time_span(4)+execution_time(temp_task,4);
input=0;
else
%% 表示非本地卸载
start(temp_task)=max(idle(task_allocation(temp_task)),temp_est);
if (start(temp_task)> idle(task_allocation(temp_task)))&&(not(idle(task_allocation(temp_task))==0)) %计算浪费的时间
%waste_time=waste_time+(start(temp_task)-idle(task_allocation(temp_task)));
time_span(task_allocation(temp_task))=time_span(task_allocation(temp_task))+(start(temp_task)-idle(task_allocation(temp_task)));
%time_span需要加上waste_time
end
finish(temp_task)=start(temp_task)+execution_time(temp_task,instance_id(task_allocation(temp_task)));
idle(task_allocation(temp_task))=finish(temp_task); %完成标志队列
time_span(task_allocation(temp_task))=time_span(task_allocation(temp_task))+execution_time(temp_task,instance_id(task_allocation(temp_task)));
%每台虚拟机的使用时间
input=instance_id(task_allocation(temp_task));
end
accomplish_num=accomplish_num+1;
input_task=temp_task;
if(accomplish_num==task_num) %表示所有任务均完成完毕
%运算结束后,向终端传输最终的计算结果
if(input==1) %来自云
translate_time=task_out(input_task)*translate_rate(1);
elseif(input==2 || input==3) %来自边缘
translate_time=task_out(input_task)*translate_rate(2);
end %来自终端自己就不需要再进行数据传输消耗时间
finish(temp_task)=finish(temp_task)+translate_time;
end
ready(temp_task)=0;
suc = find(task(temp_task,:)==1); %获取当前任务的后继节点
task(temp_task,:)=0; %邻接矩阵该列置0
task_mem=task_out(input_task);
if ~isempty(suc) %如果存在后继节点
for i=1 : length(suc)
if not(any(task(:,suc(i)))) %判断该后继是否还有别的前驱
ready(suc(i))=1;
%数据传输时间
translate_time=0;
if(task_allocation(suc(i))==0) %到达终端
if(input==2 || input==3) %来自边缘
translate_time=task_mem*translate_rate(2);
elseif(input==1) %来自云
translate_time=task_mem*translate_rate(1);
end
else
if(input==1) && (instance_id(task_allocation(suc(i)))==2 || instance_id(task_allocation(suc(i)))==3) %云到边缘
translate_time=task_mem*translate_rate(1);
elseif(input==2 || input==3) && (instance_id(task_allocation(suc(i)))==1) %边缘到云
translate_time=task_mem*translate_rate(1);
elseif(input==0) && (instance_id(task_allocation(suc(i)))==1) %终端到云
translate_time=task_mem*translate_rate(1);
elseif(input==0) && (instance_id(task_allocation(suc(i)))==2 ||instance_id(task_allocation(suc(i)))==3) %终端到边缘
translate_time=task_mem*translate_rate(2);
elseif(input==2 && instance_id(task_allocation(suc(i)))==3) || (input==3 && instance_id(task_allocation(suc(i)))==2) %边缘到边缘
translate_time=task_mem*translate_rate(2);
end
end
EST(suc(i))=max(finish(temp_task)+translate_time,EST(suc(i))); %计算该节点的EST
end
end
end
end
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化