对于任何网络程序来讲,定时器管理都是重头戏。erlang更是依赖于定时器。基础的timer主要是由time.c erl_time_sup.c实现。timer是基于time wheel的实现,支持time jump detection and correction。 上层的erl_bif_timer.c io.c中实现。
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的线程里面调用的,不能做非常耗时的操作,否则会阻塞调度器。
分享到:
相关推荐
Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...
Erlang是一种面向并发的编程语言,它采用轻量级进程以及消息传递模型,非常适合于编写并发和分布式系统。Erlang的函数式编程特性以及对模式匹配的支持,为实现KMP算法提供了便利。 在给定的文件内容中,通过Erlang...
Erlang零成本实现云计算,为初学者提供参考和学习,并为企业建设云提供帮助
在游戏开发领域,由于其并发处理能力和强大的故障恢复机制,Erlang常被用来构建可扩展、高可用性的游戏服务器。Ranch库提供了一种简单的方式来管理多个并发连接,并且它的API设计得简洁明了,使得开发者可以快速地...
Erlang是一种函数式编程语言,以其并发性、容错性和热代码升级能力而闻名,而RabbitMQ则是基于Erlang构建的一个开源消息代理,用于实现应用程序之间的异步通信。 **Erlang** Erlang由瑞典电信设备制造商Ericsson...
Erlang的并发模型和 otp 设计模式使得系统能够轻松实现负载均衡和故障切换。当一个节点或进程失败时,系统可以重新分配工作,确保服务的连续性。 ### 9. BEAM虚拟机 BEAM是Erlang运行时系统的名称,全称为伯尔尼...
Erlang emulator 实现分析Erlang emulator 实现分析
Erlang是一种并发性极强、容错性良好的编程语言,而RabbitMQ则是一个基于AMQP(Advanced Message Queuing Protocol)的消息中间件,它利用Erlang的强大特性来实现高可用性和可扩展性。 首先,让我们深入了解一下...
【标题】"erlang和rabbitmq.zip" 涉及到的是两个关键技术:Erlang编程语言和RabbitMQ消息队列系统。Erlang是一种并发性极强、容错性出色的函数式编程语言,而RabbitMQ是基于Erlang开发的开源消息代理和队列服务器。 ...
5. 容错与恢复:了解Erlang的故障检测和恢复机制,以及如何利用OTP库来实现系统的高可用性。 6. 热代码升级:学习如何在不中断服务的情况下更新运行中的Erlang应用程序。 7. 源码分析:书中可能包含一些实际项目或...
4. **错误调试**:Erlang的错误处理机制,如shell的使用、日志和调试工具。 5. **REPL(Read-Eval-Print Loop)**:Erlang shell的使用,它是学习和测试Erlang代码的重要工具。 6. **实际应用案例**:可能包含...
3. **分布式特性**:Erlang的分布式特性使得构建分布式系统变得简单,RabbitMQ正是利用这一特性实现集群部署,从而提供跨节点的高可用性和负载均衡。 4. **性能优化**:Erlang 24.2版本可能包含对内存管理和垃圾...
- **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...
通过这些组件,Erlang应用可以实现异步处理任务,提高系统的响应速度和整体性能。例如,一个高流量的Web服务可以使用RabbitMQ来缓存和分发请求,避免直接处理导致的延迟或崩溃。 总之,Erlang作为一种强大且适应性...
Erlang零成本实现云计算.pptx
- **故障隔离**: Erlang VM设计时考虑到了系统的容错性,通过监控和链接机制实现了故障隔离。 - **垃圾回收**: VM具有自动垃圾回收机制,但开发者可以通过调整来优化垃圾回收行为。 - **内部实现**: - **内存管理...
Erlang 的进程模型支持抢占式调度,通信机制基于消息传递,且有专门的监控和调试工具,如etop。 **Erlang 的系统组成** - 编译器:负责将Erlang代码编译为opcode - 库:包含各种标准模块和函数 - VM + 基本库:...