NS2学习(3)——mac定时器

      今天学习了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
主要方法:
1void
MacTimer::start(double time)
{
 ...
 stime = s.clock();    //记录定时开始时调度器的时间
 rtime = time;         //设置定时器计时时长
 ...
 s.schedule(this, &intr, rtime);
}
功能:定时器开始计时,并调用schedule()使事件调度器在经过rtime时间后通知定时器处理超时。
2void
MacTimer::stop(void)
{
        ...
 if(paused_ == 0)
  s.cancel(&intr);
        ...
}
功能:取消调度器中该定时器事件。
3inline double expire(void) {
  return ((stime + rtime) - Scheduler::instance().clock());
 }
功能:返回距离定时器超时还有多久时间。

2.BackoffTimer : MacTimer
功能:用于竞争退避机制。在检测到介质持续空闲了一个DIFSDCF InterFrame Space)或EIFSExtended InterFrame Space)时长后,若此时站点STA的回退计时器backoff timer为零,则STA将产生一个随机回退时间而不是立即接入,从而减少多个等待的STADIFS后同时接入而产生冲突;不为零时则继续按照回退计时器内容等待。
注意:
1Backoff Time = Random() × aSlotTime
2) Random()返回[0,CW]间的一个随机整数,CW为当前竞争窗口大小;
3) 在DIFSEIFS结束后STA继续检测介质,每检测完一个空闲aSlotTime时长回退计时器就减一;若在回退计时器计时工作期间检测到介质忙,则暂停回退计时器,待介质重新空闲且持续DIFSEIFS后,回退计时器才继续。
4) 回退计时器减为零时,立即开始信道占用。
主要方法:
1void BackoffTimer::handle(Event *)
    调用Mac802_11::backoffHandler()过程,完成backoff超时处理。
2void
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);
 }
}
3void BackoffTimer::pause()
    暂停回退计时器的实际操作,修改超时时间,取消调度器中该定时事件。
4void 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调度Timerhandle()方法,表示定时器超时,进而实现定时器超时处理;
3. 超时前可以调用Timerstop方法,进而调用Scheduler::cancel(e)方法,取消定时器计时事件。

 

 

参考:

http://blog.chinaunix.net/u1/47073/showart_1359554.html

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值