erlang知识库 |
||
|
底层研究
erts运行期内存使用情况查看
翻erlang的代码发现erlang对memory的管理非常重视 内置了多种内存allocator: B: binary_alloc D: std_alloc E: ets_alloc F: fix_alloc H: eheap_alloc L: ll_alloc M: mseg_alloc S: sl_alloc T: temp_alloc Y: sys_a ...
erl_call erlang cnode 功能强大
otp_src_R11B-5\lib\erl_interface\src\prog\erl_call.c 是个不错的工具, 就是ei的前端能够通过cnode给erlang的后端发各种请求。 具体的见 主题: 如何把erlang应用在项目中? http://www.iteye.com/topic/100425 where: -a apply(Mod,Fun,Args) (e.g -a 'erla ...
Erlang: 当你net_adm:ping(Node)的时候发生了什么?
当你net_adm:ping(Node)的时候发生了什么? 这个涉及到很复杂的流程。让我为你解刨: 这个流程很长而且在erlang代码和c代码里面窜来窜去,重要的点 我用红字标注 请各位耐心。 1. net_adm.erl: ping(Node) when is_atom(Node) -> case catch gen:call({net_kernel, Node}, '$gen_call' ...
erlang driver和热部署(重要)
erlang的热部署包括2个方便的 beam(.beam)级别的和driver(.dll .so)级别的. beam级别的就简单。但是driver级别的就相对复杂很多。 先看下erl_ddll的说明: Loading and reloading for code replacement This scenario occurs when the driver code might need re ...
file:read_file的注意细节
arbow发现的问题如下: 4> file:read_file("/proc/cpuinfo"). {ok,<<>>} 11> {ok, IoDevice} = file:open("/proc/cpuinfo", [binary]),file:read(IoDevice, 1024). {ok,<<&quo ...
Async线程pool及其作用
erlang能够利用多核心cpu的基础设施有2个 1. 进程调度器 2. async 线程池。 其中 async 线程池主要设计用来 能够在driver里面异步的执行费时操作, 因为driver是在调度器里面调用的 不过费时操作的话 会block掉整个调度器 而且调度器资源有限。 细节参见 erl_async.c Driver API: Asynchronous calls The lat ...
Erlang分布的核心技术浅析
Erlang系统在我看来有3个特性 1. 分布 2. 多核心支持 3. fp。 这这3个特性中分布我认为是erlang最强大的,从第一个版本就支持到现在,相对非常成熟,而多核心支持是这几年才加进去的。 erlang的分布系统做到了2点 1.节点的位置无关性。 2. 对用户分布式透明的。具体体现就是node是靠名字识别的, 进程也是靠pid来识别。 分布系统就要实现节点间通讯,erlang也不列外 ...
erlang内置的port相关的驱动程序
erlang能够利用多核心的优势不仅体现在多线程的smp调度器,更在port上面上体现。通过执行外部程序,接管它的输入输出, 实现了安全性和充分利用cpu计算资源。 erlang的io设计体现了unix一切以文件为中心的思想。在port设计上也是.这3个驱动程序都是把相关的东西转化成文件句柄,登记到poll上面,利用强大的IO poll来实现上层语义的整合。 ErlDrvEntry spawn ...
smp下async_driver的用途和匠心
/* INTERNAL use only */ struct erl_drv_entry async_driver_entry; erlang beam里面有个async_driver设计的比较有意思。 在多处理器beam里面,线程间需要通讯。常规的情况下用condition再有个队列之类的辅助。 但是这个设计不能充分利用io的优势,而且使用起来很麻烦。async_driver就是设计给这个用途的 ...
erlang的timer和实现机制
对于任何网络程序来讲,定时器管理都是重头戏。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 ...
erlang的IO调度
erlang的调度有2种: 1. 进程调度 2. IO调度。网络程序的事件来源基本上只有2种:IO和定时器。IO事件有可能是大量的, 不可预期的,所以在设计上要考虑和进程调度平衡。erlang的 erl_port_task就是为这个目标设计的。 poll检查到io时间的时候,会回调iread和oready函数。这2个会把这个队列加到porttask的调度队列去。 static ERTS_INLI ...
erlang运行期的自省机制
erlang运行期最值得称道的地方之一就是完备的自省机制,也就是说你可以通过这些信息了解整个系统运行的方方面面,给系统的调试,排错,调优,运营提供非常大的便利。在beam的c实现代码中至少1/4的代码在为这个目标服务,信息非常的到位详细,这和爱立信作为商业公司运营交换机的需求有很大的关系。自省分为2个层面的:提供erts运行期信息的和用户进程相关的信息。包括一下一个基础设施:system_flag, ...
erlang对port子进程退出的处理
erlang通过port来spawn外部程序 重定向外部程序的stdin, stdout到一对pipe行通信的,利用poll来检测外部程序的读写事件。但是如果外部程序退出的话,erts如何知道并且加以处理的呢? erts运行的时候会初始化smp_sig_notify,开启一个信号处理线程,在这个线程里面做具体的信号处理。 static void init_smp_sig_notify(void) ...
erlang的进程调度器工作流程
在多处理器机器上erlang默认是有几个cpu就有几个调度器线程,除非你通过+S N 参数来改变。每个调度器线程的入口函数是process_main, 外加一个主线程阻塞在select上等待中断事件的发生. process_main会调用schedule选择一个合适的process来执行。每个process里面都包含了要执行的的MFA,执行funtcion的opcode。beam_emu的opcod ...
erlang进程退出时清扫的资源
ERTS要终止一个经常的时候调用一下函数 void erts_do_exit_process(Process* p, Eterm reason) { ErtsLink* lnk; ErtsMonitor *mon; #ifdef ERTS_SMP erts_pix_lock_t *pix_lock = ERTS_PID2PIXLOCK(p->id); #endif p->ar ...
群组知识库热门文章
- 44289 进入Erlang的世界
- 11559 gen_server入门
- 11527 如何写超强伸缩性的多游戏玩家服务器
- 8613 Erlang类型及函数声明规格
- 6361 使用etop查看系统中进程信息
最新评论
我是erlang 菜鸟,弱弱的问一下,erlang帮助文档,那有怎么用,连 Mod名、Func名,是什 ...
wrj913 评论了 Programming Erlang读书笔记8: Concurrency ...
wrj913 评论了 Programming Erlang读书笔记8: Concurrency ...
不明白为什么第一个例子handler(Socket)中close(Socket)后还调用了handle ...
erlangguy 评论了 Erlang中的half-sync/half-async和Leader/F ...
erlangguy 评论了 Erlang中的half-sync/half-async和Leader/F ...
event manager本质上是维护一个{Module, State}对的list,每个Module ...
erlangguy 评论了 OTP Design Principles: Gen_Event Behavio ...
erlangguy 评论了 OTP Design Principles: Gen_Event Behavio ...