`
hideto
  • 浏览: 2650044 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang内存管理和运行模式笔记

阅读更多
Erlang进程非常轻量级
进程间通过消息传递进行通讯
进程接收消息时无法判断消息是共享的还是物理上复制过来的,这取决于Erlang运行时系统
每个进程都有一个邮箱,或者说是消息队列,队列中包含所有发给该进程的消息的指针
消息本身是一个term,存储在堆上
进程调用receive语句时会扫描邮箱直到找到第一个匹配的消息
发送消息时接收者由进程id来指定,而不管进程位于何处

Erlang/OTP的三种运行时系统
Erlang/OTP的运行时系统基于process-centric架构,其中每个进程分配和管理自己的私有内存区域,这样做的优势是gc的latency很低
另外Erlang/OTP还带有两种运行时系统:communal和hybrid
communal中所有进程共享堆,hybrid则是每个进程对于自己的数据有自己的堆,而进程间的消息则存放在共享的堆上
Process-centric的优点是gc的latency低,缺点是进程间通讯要复制消息
Communal的优点是进程间通讯快,而gc 的latency大
Hybrid则恰好中合了这两者的优点
Hybrid是最佳实践,性能比其他两者都好,并且支持大量线程伸缩性实现
Symmetric multiprocessing
erlang的beam模拟器
1,beam        process-centric,默认的
2,beam.smp    communal,共享内存
3,beam.hybrid hybrid,混合型

Actors vs. Erlang中说到:
引用

Actually Erlang has 3 memory models: private heap, shared and hybrid (which is somewhat in between). As far as I remember this feature is still experimental so I did not found any info about this in Erlang docs. I think hybrid architecture was switched on with "-hybrid" flag passed to erl. Shared heap was found to be not so good but hybrid architecture performs better on most of Erlang applictions.

很长一段时间里Erlang/OTP都是默认使用process-centric运行时系统,使用private heap,完全无共享内存
自从OTP R12B开始,如果OS发现有多个核,SMP会自动打开,利用多核优势,见关于SMP Erlang的一些事实
这样的话,以后Erlang就会默认搞成使用SMP架构,共享内存,给内存加锁来实现隔离,充分利用多核优势
这样看来Erlang标榜的“无共享内存,纯净的消息传递”架构已经被取缔了,但是从上层进程间通讯调用模式来看还是消息传递模式,只不过底层实现改了而已
然而我们使用启动参数还是可以使用process-centric或hybrid模式的,具体内存优化看应用场景而定了
分享到:
评论
4 楼 mryufeng 2009-03-20  
Hybrid目前的open source未实现!
3 楼 stoneyzjw 2008-10-03  
你是德瑞克?
2 楼 hideto 2008-09-26  
communal和hybrid下都不会,现在r12b默认采用smp方式了,内存共享,消息不会被复制了
1 楼 cryolite 2008-09-25  
如果传递的消息里有一个很大的binary,比如64MB,是不是说在process-centric下每发这样一个消息都会复制一份binary;在communal不会有复制,hybrid呢,可能也不会。

相关推荐

Global site tag (gtag.js) - Google Analytics