#action Blog 블로그 더하기
##Blog
{{{#!blog hyacinth 2009-08-08T19:15:07 MATLAB 다중접속(Multiple Access) 프로토콜 시뮬레이션 (2)
이제 지난번 보인 시뮬레이션 프로그램에서 초기 조건들을 변화시켜 보면서 다중접속 프로토콜의 시뮬레이션 과정을 살펴 보자.
먼저 단말 대수를 한대로 설정하고 패킷 충돌이 없는 경우 내부 변수가 어떻게 변화하는지 확인하며 프로그램 흐름을 살펴보도록 하겠다.
main.m
42 : Mnum = 100; –> 42 : Mnum = 1;
[[HTML(
)]]
그림1-1. 단말 대수가 1대일 때의 전송률과 평균지연시간
모든 시간단위에 거쳐 전송된 모든 패킷이 성공적으로 전송되므로 부하(G;프레임 전송 시간에 생성되는 프레임의 비율. 즉, 200kbps의 공유 채널에서 200비트의 프레임을 전송하려 하면 전송 시간은 1ms이다. 시스템이 매초 500개의 프레임을 만들어낸다면 이는 1ms마다 1/2개의 프레임이다. 부하는 1/2이다.)가 1일 때 당연히 전송률은 1이 된다. 그런데 G가 전송률을 넘어서 버리면 프로그램을 종료시키는 부분이 있어 이를 확인하기 전에 프로그램이 종료되어버리고 만다. 그 부분에 대한 주석처리를 하고 다시 확인해 보았다.
main.m
80 : for G=[0.1:0.1:1,1.2:0.2:2]
81 : % if G >= Mnum
82 : % break
83 : % end
[[HTML(
)]]
그림1-2.
부하가 1일 때 전송률이 1이 되고 이를 넘지 않는다(당연히 전송률이 1을 넘을 수 없다. 있지도 않은 패킷을 보낼 수 없으니). 이론값 그래프는 조금 다른데 이는 이론적인 전송률(S=G*e^-2G) 유도과정에서, 접속지점으로 단위시간 내 전송되는 패킷의 기대값을 구할 때 생성되는 패킷의 수가 Poisson 분포를 따른다고 가정했기 때문에, 접속지점이 늘어나면 시뮬레이션 결과가 이론값에 수렴할 것으로 생각된다.
단말 대수를 두대로 늘려보면.(충돌이 생기는 경우)
main.m
42 : Mnum = 100; –> 42 : Mnum = 2;
[[HTML(
)]]
그림2. 단말 대수가 2대일 때의 전송률과 평균지연시간
최소한의 충돌이 생기는 경우이지만 최적 부하 G는 역시 1/2로 단말 대수가 100대일 때와 크게 다르지 않다.
시뮬레이션에서 가장 핵심이 되는 부분은 now_time과 next_time 변수인데 now_time에서 각 단말별 패킷 전송 시간에 대한 정책을 결정하고 충돌여부를 판단하게 된다.
https://hfwx6w.blu.livefilestore.com/y1mAaxBVIoWCDsZ2bh62U4YNHi57GaX6BbqjOFLQbytDE1Nve2GfC9EqoU7AgY2tl6WESAnQk9y6qP6jNBxrsc5kDf1ISr87y1HqNx8rnZq7TTf4Pb2TdoVPkmPO6I-GH8OhflSzZ-6NbqZB35E0mW5pQ/p02_02_thumb3.gif
그림3. 순수 ALOHA의 프레임 전송
main.m
80 : for G=[0.1:0.1:1,1.2:0.2:2]
…
92 : now_time = feval(char(protocol(pno)),-1);
93 :
94 : while 1
95 : next_time = feval(char(protocol(pno)),now_time);
while 루프 안에서 next_time = feval(char(protocol(pno)),now_time); 이 반복되면서 next_time 을 구한다. feval은 MATLAB에서 문자열로 함수를 호출하는 함수인데 protocol(pno)가 paloha일 때 paloha(now_time);과 완전히 동일하다. next_time은 가장 빠른 접속 단말의 다음 전송 시간이다. 즉, 그림3에서 프레임 1.1 전송 시작시간 –> 프레임 3.1 전송 시작시간 –> 프레임 2.1 전송 시작시간 … 이 될 것이다.
{{{#!folding paloha.m
% Program 6-6
% paloha.m
%
% Pure ALOHA System
%
% Input argument
% now_time : now time but, now_time<0 initialized the access
% terminals
% Output argument
% next_time : next stae change time
%
% Programmed by M.Okita
% Checked by H.Harada
%
function [next_time] = paloha(now_time)
global STANDBY TRANSMIT COLLISION
global Srate Plen
global Mnum Mplen Mstate
global Tint Rint
global Spnum Splen Tplen Wtime
persistent mgtime mtime
if now_time < 0
rand('state', sum(100*clock));
mgtime = -Tint * log(1-rand(1,Mnum));
mtime = mgtime;
Mstate = zeros(1,Mnum);
Mplen(1:Mnum) = Plen;
next_time = min(mtime);
return
end
idx = find(mtime==now_time & Mstate==TRANSMIT);
if length(idx) > 0
Spnum = Spnum + 1;
Splen = Splen + Mplen(idx);
Wtime = Wtime + now_time - mgtime(idx);
Mstate(idx) = STANDBY;
mgtime(idx) = now_time - Tint * log(1-rand);
mtime(idx) = mgtime(idx);
end
idx = find(mtime==now_time & Mstate==COLLISION);
if length(idx) > 0
Mstate(idx) = STANDBY;
mtime(idx) = now_time - Rint * log(1-rand(1,length(idx)));
end
idx = find(mtime==now_time);
if length(idx) > 0
Mstate(idx) = TRANSMIT;
mtime(idx) = now_time + Mplen(idx) / Srate;
Tplen = Tplen + sum(Mplen(idx));
end
next_time = min(mtime);
\}}}
paloha.m 함수가 하는 일은 각 단말의 패킷 전송 시간과 각 단말의 현재 상태를 비교해 전송 상태(충돌 여부)를 결정하고, 충돌이 일어나면 정책(1-persistent 혹은 P-persistent)에 따라 다음 전송 시간을 정하고, 대기 상태면 전송을 시작하고(상태를 전송으로 바꾸고), 전송이 완료 되면 상태를 대기 상태로 바꾸고 다음 시간 전송 시간을 정한다. 즉 프로토콜의 기능을 구현하는 모든 부분이다. paloha.m 외 saloha.m, npcsma.m, carriersens.m 파일(함수)이 각각 Slotted ALOHA, non-persistent CSMA, Slotted np-ISMA 프로토콜을 정의한다.
paloha.m 의 초기화 부분을 잠깐 살펴보면,
28 : mgtime = -Tint * log(1-rand(1,Mnum));
패킷이 생성되는 시간이다. rand(1,Mnum));는 접속 단말 수만큼 균등 분포의 난수 행렬을 생성한다.
29 : mtime = mgtime;
패킷이 전송되는 시간이다. 이 부분만 보면 mgtime과의 차이가 무엇인지 잘 이해가 안 갈 수도 있는데 Slotted ALOHA에 관련되는 부분이라 하면 이해가 갈 것이다. 패킷이 생성된 시간과 전송되는 시간은 다를 수 있다. 순수 ALOHA는 패킷 생성이 일어나는 즉시 전송된다.
30 : Mstate = zeros(1,Mnum);
{{{>> help zeros\}}}
{{{ZEROS Zeros array.\}}}
모든 단말의 상태를 0(STANDBY)
32 : next_time = min(mtime);
다음 시간은 가장 빠른 다음 전송 시간이 된다.
가장 처음 수행되는 초기화 부분 아래로 전송 상태(TRANSMIT), 충돌 상태(COLLISION), 대기 상태(STANDBY)의 행동을 결정하는 부분이 이어져 있다.
36 : idx = find(mtime==now_time & Mstate==TRANSMIT);
find 함수는 행렬을 성분 대 성분(element-by-element)으로 비교해 조건에 만족하는 성분의 위치를 값으로 갖는 행렬로 반환한다.
시간을 슬롯화하여(Time Slotted) 충돌을 줄이려 하거나, 신호 감지로 충돌을 피하려하는(Carrier Sense) 프로토콜 등 여러가지 필요한 조치가 추가되나 큰 틀에서 경합(Contention) 프로토콜(혹은 랜덤 접속;Random Access) 종류의 프로토콜은 위 과정은 동일하다.
----
(1)을 건너 뛰고 (2)를 썼는데-_- (1)에 순수 ALOHA, Slotted ALOHA, no-CSMA, Slotted np-ISMA에 대한 이론 설명과 MATLAB 결과가 도입부로 나왔다 치면 좋겠다. (1)도 조금 써봤는데 특별한 부분도 없고 이론은 이론서에 훨씬 자세하게 설명되어 있고 프로그램은 나중에 다 설명이 되는거라.. -- [hyacinth] [[DateTime(2009-08-08T19:27:16)]]
----
아, 프로그램 전체는 있어야 하나.. 그거라도 올리는 것이 좋겠다. -- [hyacinth] [[DateTime(2009-08-08T19:29:32)]]
}}}
[[HTML(