?? 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 + -