본문

OMNeT++ SimpleQueue 분석 #1. Outline



sample폴더의 queuenet에는 queueinglib을 사용하여 다양한 큐 모델을 시뮬레이션할 수 있도록 파일들이 준비되어있다. 그중에서 가장 간단한 예제로 SimpleQueue가 있는데, source, server, sink의 세 구성요소를 통해 M/M/1 모델을 구현한다. 참고로 이 게시물에서는 Queueing Wizards의 New Queueing Model 옵션을 사용하여 '새로 구성한' OMNeT++ 프로젝트이며(그래도 SimpleQueue와 거의 유사하다), 이 과정에 대해서는 추후에 자세히 다루려 한다. 아무튼 수행 결과로는 위에 첨부한 그림과 같으며, 이 시리즈에서는 각 구성요소의 소스를 차근차근 밟아가기로 한다.


Omnetpp.ini

[General]

network = Test

 

**.numJobs = 1000

*.source.interArrivalTime = exponential(${11..20}s)

*.server.serviceTime = exponential(10s)


network = Test 라인을 통해 Test.ned 에서 네트워크가 서술된다고 명시한다.  ${11..20}s 표기는 iteration variables을 의미하며, 11부터 20까지의 정수를 나타낸다. 위 코드에서는 ρ<1하에서 M/M/1 에서의 성능 평가를 위해 λ(Arrival Rate)에 변화를 주는것이며, iteration variables의 사용과 큐잉 이론에 관해서는 또 다른 게시물에서 설명할 것이다. 그리고 시뮬레이션의 신뢰성을 위해 큐잉 작업의 개수를 1000으로 지정하였다.


Test.ned

import org.omnetpp.queueing.Source;

import org.omnetpp.queueing.Queue;

import org.omnetpp.queueing.Sink;


network Test {

    submodules:

        source: Source; server: Queue; sink: Sink;

    connections:

        source.out --> server.in++; server.out --> sink.in++;

}


전체적인 네트워크를 구성하는 Test.ned이다. import된 Source, Queue, Sink 클래스가 각각 source, server, sink로 인스턴스화 되어있으며(submodules). 이들의 게이트들이 서로 연결되어 있다. 참고로 server.in++에서 ++가 붙은 이유는 Queue.in이 input in[]으로 선언되어있는 입력 게이트 벡터(배열)이기 때문이다(queueinglib에서는 A/B/C/K/N/D 의 확장성을 위해 이렇게 설계되었다), 이 프로젝트의 전체적인 클래스 흐름과 큐잉 타이밍을 아래 그림을 통해 표현해보았다.





시뮬레이션 결과는 다음과 같다. ρ가 1에 가까워 질수록 증가폭이 상승하는 것을 확인할 수 있다.



댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.