📄 ex_gated_sim.asv
字号:
% 仿真程序 两类数据 一类穷尽 然后二类门限 数据源受限因为为了获得有界的等待时延 恒 定 跳 转%
clear;
r=10;%共有r个 假 站 r/2个工作站
s=ones(1,r);%各工作站所有数据的服务时间 单位妙
l=zeros(1,r);u=zeros(1,r);
s_load=0.6;
l(1)=0.5/2*s_load;l(2)=l(1);
l(3)=0.125/2*s_load;l(4)=l(3);
l(5)=0.125/2*s_load;l(6)=l(5);
l(7)=0.125/2*s_load;l(8)=l(7);
l(9)=0.125/2*s_load;l(10)=l(9);
for i=1:r/2,
u(2*i-1)=0;
u(2*i)=0.1;
rule(2*i-1)=0;
rule(2*i)=1;
end
t_sim=10*3600;%仿真时间 单位秒?3600秒为1小时
load=zeros(1,r);s_u=0;x=0;s_load=0;max_l=0;% 计算负载率
for i=1:r,
load(i)=l(i)*s(i);s_u=s_u+u(i);s_load=s_load+load(i);x=x+load(i)+l(i)*u(i); %稳定性条件 要保证<1
if max_l<l(i),max_l=l(i);end
end
c=s_u/(1-s_load);
Ts_p=1.2*t_sim/c; % 估计轮询周期数目
l_wlist_p=20;% 估计最大等待信元数目
%信元生成数据
t_arr=zeros(r,1.1*max_l*t_sim);%存放各站各信元的到达时间
t_srv=zeros(r,1.1*max_l*t_sim);%存放各站各信元的服务所需时间
%生成仿真数据
for i=1:r%每个站都生成信元
t=0;j=1;
while t<(t_sim+10*c),%再仿真结束之后几个周期以后不再有信元
t=t+(-1.0)/l(i)*log(1-rand);
t_arr(i,j)=t;%存储信元到达的时刻 %每个工作站在仿真结束之后都会多产生一个
t_srv(i,j)=(-1.0)*s(i)*log(1-rand);%存储信元到达的时刻
j=j+1;
end
end
x=0;y=0;for i=1:j,
x=x+t_srv(r,i);
y=y+t_srv(r,i)*t_srv(r,i);
end
x=x/j
y=y/j
%中间变量
i_come=zeros(1,r);%记录各站最晚到达的信元,用以标志数组
l_waitlist=zeros(1,r);%记录当前等待的信元数目
waitlist=zeros(r,l_wlist_p);%存储等待发送的信元的序号,最早到达的被排放在第一个位置
L_ii=zeros(r,Ts_p);%记录各站在服务器到来各时刻等待服务的信元数目
W=zeros(r,Ts_p);%记录各站各被服务的顾客等待时间
n_srvd=zeros(1,r);%记录各站被服务的数目
%仿真过程
t=0;T=0;
while t<t_sim,
T=T+1;%新的周期开始了,先从工作站1开始轮询
for i=1:r, % 服务器到达了
% %整理一周期内新到达的数据使之入服务队列
while t_arr(i,i_come(i)+1)<t,
%表明指针所指的下一个信元是在当前时刻之前到达的,应当入等待队列;
i_come(i)=i_come(i)+1;%移动指向这个刚刚符合到达条件的信元,信元的序号产生了
l_waitlist(i)=l_waitlist(i)+1;%等待队列长度增大
waitlist(i,l_waitlist(i))=i_come(i);%将该信元的序号放入该站的等待队列的尾部
end
L_ii(i,T)=l_waitlist(i);%统计该周期内,服务器到达此站时,此站的信元等待队列长度
% %服务
if l_waitlist(i)>0 %服务器到达时,该工作站非
if rule(i)==0, % 门限式服务
for j=1:l_waitlist(i),% 门限式服务,将所有门限到达的数据全部发送出去
n_srvd(i)=n_srvd(i)+1;%统计被服务的信元数目
W(i,n_srvd(i))=t-t_arr(i,waitlist(i,j));%统计将要被服务信元的等待时间
t=t+t_srv(i,waitlist(i,j));%时间往前推移头信元的服务时间,彷佛发送完毕
waitlist(i,j)=0;
end
l_waitlist(i)=0;%门限时刻的数据全部发送完毕
end
if rule(i)==1, % 穷尽式服务
for j=1:l_waitlist(i),% 将所有门限到达的数据全部发送出去
n_srvd(i)=n_srvd(i)+1;%统计被服务的信元数目
W(i,n_srvd(i))=t-t_arr(i,waitlist(i,j));%统计将要被服务信元的等待时间
t=t+t_srv(i,waitlist(i,j));%时间往前推移头信元的服务时间,彷佛发送完毕
waitlist(i,j)=0;
end
l_waitlist(i)=0;%门限时刻的数据全部发送完毕
while t_arr(i,i_come(i)+1)<t, %表明指针所指的下一个信元是在当前时刻之前到达的,应当入等待队列;
i_come(i)=i_come(i)+1;%移动指向这个刚刚符合到达条件的信元,信元的序号产生了
n_srvd(i)=n_srvd(i)+1;%统计被服务的信元数目
W(i,n_srvd(i))=t-t_arr(i,i_come(i));%统计将要被服务信元的等待时间
t=t+t_srv(i,i_come(i));%时间往前推移头信元的服务时间,彷佛发送完毕
end %将服务期间到达的数据发送出去 体现了穷尽式服务
end
end % if l_waitlist(i)>0 %服务器到达时,该工作站非工作站为空时,服务器离开
t=t+u(i);%-1.0)*u(i)*log(1-rand); %将时间往前推移走步时间,完毕后服务器到达下一工作站
end % 轮询下一个工作站
end %时间若超过仿真时间,结束
%统计平均等待时间等性能
for i=1:r,
sum1=0;sum2=0;
for j=1:n_srvd(i),%每一个被服务的信元都要统计
sum1=sum1+W(i,j);%统计等待时间均值
end
w_avrg(i)=sum1/n_srvd(i);
for j=1:T,%每一个周期服务器来到时,等待对长都要被统计
sum2=sum2+L_ii(i,j);%统计等待对长均值
end
l_avrg(i)=sum2/T;%统计等待对长均值
end
w_avrg
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -