今天学习了NS2中定时器的工作机制,以mac-timers.cc为例。在网上找了一篇写得不错的博客做参考,自己也简单地总结了一下。
文件:~ns/mac/mac-timers.[h,cc]
mac定时器相关类:
父类 MacTimer : Handler
子类 BackoffTimer : MacTimer
DeferTimer : MacTimer
BeaconTimer : MacTimer
ProbeTimer : MacTimer
IFTimer : MacTimer
NavTimer : MacTimer
RxTimer : MacTimer
TxTimer : MacTimer
1.MacTimer : Handler
主要方法:
(1)void
MacTimer::start(double time)
{
...
stime = s.clock(); //记录定时开始时调度器的时间
rtime = time; //设置定时器计时时长
...
s.schedule(this, &intr, rtime);
}
功能:定时器开始计时,并调用schedule()使事件调度器在经过rtime时间后通知定时器处理超时。
(2)void
MacTimer::stop(void)
{
...
if(paused_ == 0)
s.cancel(&intr);
...
}
功能:取消调度器中该定时器事件。
(3)inline double expire(void) {
return ((stime + rtime) - Scheduler::instance().clock());
}
功能:返回距离定时器超时还有多久时间。
2.BackoffTimer : MacTimer
功能:用于竞争退避机制。在检测到介质持续空闲了一个DIFS(DCF InterFrame Space)或EIFS(Extended InterFrame Space)时长后,若此时站点STA的回退计时器backoff timer为零,则STA将产生一个随机回退时间而不是立即接入,从而减少多个等待的STA在DIFS后同时接入而产生冲突;不为零时则继续按照回退计时器内容等待。
注意:
(1)Backoff Time = Random() × aSlotTime;
(2) Random()返回[0,CW]间的一个随机整数,CW为当前竞争窗口大小;
(3) 在DIFS或EIFS结束后STA继续检测介质,每检测完一个空闲aSlotTime时长回退计时器就减一;若在回退计时器计时工作期间检测到介质忙,则暂停回退计时器,待介质重新空闲且持续DIFS或EIFS后,回退计时器才继续。
(4) 回退计时器减为零时,立即开始信道占用。
主要方法:
(1)void BackoffTimer::handle(Event *)
调用Mac802_11::backoffHandler()过程,完成backoff超时处理。
(2)void
BackoffTimer::start(int cw, int idle, double difs)
{
//生成随机回退时间
rtime = (Random::random() % cw) * mac->phymib_.getSlotTime();
//信道不空闲则暂停回退计时器
if(idle == 0)
paused_ = 1;
//信道空闲则开始回退计时
else {
assert(rtime + difs_wait >= 0.0);
s.schedule(this, &intr, rtime + difs_wait);
}
}
(3)void BackoffTimer::pause()
暂停回退计时器的实际操作,修改超时时间,取消调度器中该定时事件。
(4)void BackoffTimer::resume(double difs)
重置DIFS间隔并恢复计时。
3.DeferTimer : MacTimer
功能:表示接入信道需要延迟的时间。
4.IFTimer : MacTimer
功能:模拟发送一个完整分组所花的发送时延。
5.RxTimer : MacTimer
功能:模拟接收一个完整分组所花的接收时延。
6.TxTimer : MacTimer
功能:发送方用于对回复信息的计时。
总结一下NS中定时器工作机制:
1. 先通过定时器的start(time)方法,向Scheduler中加入延迟为time的事件,事件的处理器为Timer自己;
2. 延迟time时间之后,Scheduler调度Timer的handle()方法,表示定时器超时,进而实现定时器超时处理;
3. 超时前可以调用Timer的stop方法,进而调用Scheduler::cancel(e)方法,取消定时器计时事件。
参考:
http://blog.chinaunix.net/u1/47073/showart_1359554.html