浏览 3792 次
锁定老帖子 主题:erlang的timer和实现机制
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-07
erl +c Disable compensation for sudden changes of system time. Normally, erlang:now/0 will not immediately reflect sudden changes in the system time, in order to keep timers (including receive-after) working. Instead, the time maintained by erlang:now/0 is slowly adjusted towards the new system time. (Slowly means in one percent adjustments; if the time is off by one minute, the time will be adjusted in 100 minutes.) When the +c option is given, this slow adjustment will not take place. Instead erlang:now/0 will always reflect the current system time. Note that timers are based on erlang:now/0. If the system time jumps, timers then time out at the wrong time. erlang使用timer有3中方式: 1. 语法层面的 receive ... after ... 这个是opcode实现的,一旦timeout立即把process加到调度队列,使用频度比较高。 2. bif erlang:send_after(Time, Dest, Msg) -> TimerRef erlang:start_timer(Time, Dest, Msg) -> TimerRef 这个一旦timeout就给Dest发送一条消息,使用频度不是很高。 3.driver层面的。 int driver_set_timer(ErlDrvPort port, unsigned long time); inet_driver大量使用这个api. tcp/udp进程需要超时处理,所以有大量的连接的时候这种timer的数量非常大。定时器超时后把port_task加到调度队列。 定时器的最早超时时间用于poll的等待时间。 整个定时器由bump_timer来驱动。bump_timer是在schedule的时候不定期调用的。总之使用timer的时候要小心,因为timer实在scheduler的线程里面调用的,不能做非常耗时的操作,否则会阻塞调度器。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |