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模式的,具体内存优化看应用场景而定了
分享到:
相关推荐
多块carrier的大小由Erlang运行时系统参数控制。 4. 分配器类型: Erlang提供了不同类型的分配器来管理不同类型的数据。这包括用于处理临时数据的分配器,如C函数作用域、临时GC根集、分布式消息解码、ets模式规格...
Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例 根据siyao zheng博客上听写的资源进行的翻译,大致只翻译了80%但核心部分已经完整,希望对大家...
6. **OTP(Open Telecom Platform)**:OTP 是一组设计原则、库和工具,为Erlang应用提供了标准框架,包括行为、设计模式和错误管理机制。 ### Linux 查看 CPU 和内存信息 1. **top 命令**:实时显示系统总体的CPU...
Erlang的字典数据结构通常比其他语言的哈希表更快,因为它优化了并发访问和内存管理。 接下来是Java,它以其跨平台能力和丰富的库而闻名。"java_class_arr_data_test.jar"和"java_string_arr_data_test.jar"可能是...
比如使用`erlang:memory()`命令可以看到Erlang emulator分配的内存情况,包括总的内存使用量、atom使用的内存和process消耗的内存等。 4. 检查进程创建数量:通过`erlang:system_info(process_count)`可以获取当前...
它负责解释Erlang字节码,提供内存管理、垃圾回收和并发调度等功能。 ### 10. 语言特性 Erlang的语法简洁,支持模式匹配、函数式编程、列表处理和递归等特性。它的动态类型系统和强大的类型推断让代码更加灵活。 ...
5. ** OTP(Open Telecom Platform)**:OTP是Erlang生态系统的核心,提供了一套用于构建可靠和可扩展系统的框架和库,包括Mnesia数据库、分布式服务和行为模式(如GenServer、GenEvent和Gen_fsm)。 6. **热代码...
确保正确配置Erlang环境变量,以便RabbitMQ能正确识别和使用Erlang运行时系统。安装完成后,可以使用RabbitMQ的管理界面或命令行工具进行配置和管理,以满足特定的业务需求。 总的来说,RabbitMQ 3.9.13与Erlang ...
6. **BEAM虚拟机**:Erlang运行时系统BEAM的工作原理,垃圾回收机制,以及性能优化。 7. **标准库与第三方库**:Erlang的标准库介绍,如ETS(Erlang Term Storage)和Mnesia数据库,以及常用的第三方库如 Cowboy...
这涉及到监控ERTS的运行时参数,例如ETS(Erlang Term Storage)使用的内存、进程的数量和状态,以及SMP(对称多处理)支持程度等。 #### 3. 编码最佳实践 在Erlang开发中,最佳实践包括使用模式匹配、递归、消息...
5. **OTP(Open Telecom Platform)**:Erlang OTP是一套库和设计原则,提供了如行为模式(gen_server, gen_event等)、监控和分布式管理工具,简化了复杂系统的构建。 **RabbitMQ** RabbitMQ是基于AMQP(Advanced...
- **模式匹配与守卫表达式**: 使用模式匹配和守卫表达式来进行复杂的条件判断,例如: ```erlang get_length([]) -> 0; get_length([First|Rest]) -> 1 + get_length(Rest). ``` 此处定义了`get_length`函数,...
7. **BEAM虚拟机**:Erlang运行在BEAM(Erlang虚拟机)上,BEAM为Erlang提供了高效的内存管理和垃圾回收。 8. **标准库**:OTP包含了大量的库和组件,如Mnesia(分布式数据库)、Riak(分布式键值存储)等,为...
在Erlang中,程序结构由函数、模块和Beam文件组成,运行在Erlang虚拟机(VM)上。Erlang 的进程模型支持抢占式调度,通信机制基于消息传递,且有专门的监控和调试工具,如etop。 **Erlang 的系统组成** - 编译器:...
OTP是基于Erlang的一套设计原则和库,它提供了标准的组件和模式,如GenServer、GenEvent和Supervisor等,用于构建可靠的分布式系统。OTP的核心理念是模块化、可复用和容错性,通过这些组件,开发者可以快速构建出...
- **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **OTP(开放电信平台)**:Erlang OTP是一套库和设计原则,提供了构建可靠系统的框架,包括Mnesia数据库...
总的来说,"erlang和rabbitmq.zip" 提供了在Windows环境下搭建RabbitMQ服务器的基础,用户需要先安装Erlang OTP环境,然后才能安装和运行RabbitMQ。通过这两个工具,开发者可以构建高效、可靠的分布式系统,利用消息...
OTP(Open Telephony Platform)是Erlang的开源开发框架,包含了Erlang虚拟机(BEAM)、库函数、编程模式和设计原则。otp_win64_21.1.exe是OTP在Windows 64位系统的特定版本,包含了运行Erlang应用程序所需的全部...
- **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中服务器、事件处理和状态机的通用行为。 - **Elixir**:基于Erlang VM的现代编程语言,提供了更接近Ruby的语法,同时保留了Erlang的并发特性和...
ERTS是Erlang运行时系统,了解ERTS在运行期内存使用情况是优化Erlang应用的关键。这包括了解ETS(Erlang Term Storage)和Dets(Disk ETS)的使用,以及如何监控和调整内存分配。 ##### 3.2 Erlang中的调试工具 ...