这个数据的定义在Server.ned源代码中:
@statistic[channelUtilization](source="timeavg(receive)"; record=last; interpolationmode=linear; title="channel utilization");
以下为我对这句话的理解:(每个参数的准确定义见参考文献的 【4.15.2.2 Property Keys】小节及其之后的几小节)
source的意思是数据源,timeavg的意思是对括号中的内容求时间平均
record的意思是记录方式,这里是last,表示最新的值。其他的记录方式还有vector?—向量,mean----求平均,等等
interpolationmode的翻译是插值模式,这里的话就是插值模式为线性,不太理解具体的意思
title顾名思义,用来设置标题
其中它的数据源—receive的定义也在Server.ned中:
@signal[receive](type="long"); // for successful receptions (non-collisions): 1 at the start of the reception, 0 at the end of the reception
注释翻译过来就是对于成功传输(无碰撞)来说,receive这个值在开始接收时置为1,接收完成后置为0。
在server.cc中使用receive这个统计数据时,所有相关代码如下:
void Server::initialize()
{
...
receiveBeginSignal = registerSignal("receiveBegin");
receiveSignal = registerSignal("receive");
collisionSignal = registerSignal("collision");
collisionLengthSignal = registerSignal("collisionLength");
emit(receiveSignal, 0L);
emit(receiveBeginSignal, 0L);
...
void Server::handleMessage(cMessage *msg)
{
if (msg == endRxEvent) {
EV << "reception finished\n";
channelBusy = false;
emit(channelStateSignal, IDLE);
// update statistics
simtime_t dt = simTime() - recvStartTime;
if (currentCollisionNumFrames == 0) {
// start of reception at recvStartTime
cTimestampedValue tmp(recvStartTime, 1l);
emit(receiveSignal, &tmp);
// end of reception now
emit(receiveSignal, 0);
}
...
可以看到,receive确实只与成功传输时有关。在成功的收到一个帧后,将在发送开始的时候将receive置为1,在发送结束时将receive置为0。
这种知道传输结果后的“时光倒流”再将receive在开始传输时刻置为1的做法是通过这两句话实现的:
cTimestampedValue tmp(recvStartTime, 1l);
emit(receiveSignal, &tmp);
cTimestampedValue类专门用于这种情况(参考文献【4.15.5 Emitting Signals】节):
综上,ALOHA协议仿真中的channelUtilization = 传输成功的帧所用时间 ÷ 仿真总时间
如图,信道利用率 = ( t1 + t2) / t0
参考:https://doc.omnetpp.org/omnetpp/manual/#sec:simple-modules:signals【4.15 Signal-Based Statistics Recording、4.15.5 Emitting Signals】