随笔分类 - Erlang

摘要:Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上一个演讲的听写稿,详细介绍了Erlang内存体系的原理以及调优案例。 阅读全文
posted @ 2014-05-03 12:01 siyao 阅读(3629) 评论(1) 推荐(3) 编辑
摘要:本文是对BEAM虚拟机指令中和内存分配/解除分配相关指令的简单介绍。本文简要介绍了Erlang进程的堆栈模型以及虚拟机寄存器的应用,还介绍了这些指令中live参数的意义。 阅读全文
posted @ 2014-03-26 23:31 siyao 阅读(1266) 评论(1) 推荐(0) 编辑
摘要:本文简单分析了一下 Erlang R16 中新引入的数据结构 map。 阅读全文
posted @ 2014-03-09 23:25 siyao 阅读(7234) 评论(3) 推荐(0) 编辑
摘要:最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题。本文首先简单介绍脏调度器机制的用法,然后简要分析虚拟机中的实现原理,最后讨论了一下脏调度器的局限性。 阅读全文
posted @ 2014-02-15 23:54 siyao 阅读(3143) 评论(1) 推荐(2) 编辑
摘要:虽然 Erlang 是 share-nothing,而且变量 immutable 的,但是 Erlang 为了各种实用的需求还是会提供一些“后门”违反这些原则,因此在写 Erlang 程序的时候有时候也需要注意并发访问的情况。ETS 就是一个共享内存,本文描述了标准库中 digraph 模块中一个潜在的 bug。 阅读全文
posted @ 2014-01-21 07:43 siyao 阅读(1835) 评论(1) 推荐(1) 编辑
摘要:这是一篇流水账,记录了优化一个对 binary 操作的 Erlang 程序,然后发现真正瓶颈所在的过程。本文纯粹是流水账,没有什么结论,只是觉得 Erlang 很好玩:) 阅读全文
posted @ 2013-12-22 16:51 siyao 阅读(8862) 评论(4) 推荐(5) 编辑
摘要:在对 Erlang 虚拟机做 profiling 的时候,发现在 Vtune 中会出现源代码和汇编指令映射错误的现象。本文分析了这种映射错误的原因,那就是在源码文件中 #include 了另外的源码,所以编译器记录的是另外源码的行号。解决方法是手工将被 #include 的源码文件拷贝到被分析的源码中。 阅读全文
posted @ 2013-12-07 23:48 siyao 阅读(1714) 评论(0) 推荐(0) 编辑
摘要:本文简单探讨了一下 Erlang 调度器发生进程抢占的条件,然后通过示例展示 Erlang 在大部分情况下都是能做到软实时的,但是在某些极端情况下一些 misbehave 的进程会阻塞整个调度器。本文不纠细节,只是提供一个感性的认识。 阅读全文
posted @ 2013-12-01 22:47 siyao 阅读(1982) 评论(3) 推荐(0) 编辑
摘要:本系列介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现。了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数据类型。本文对 Erlang 数据类型及实现的总结目前是最全面的,可以作为 Erlang 数据结构的参考手册。尽管我写的内容都试图在各种参考资料和 Erlang 虚拟机源代码中验证,但是难免会有理解错误或各种低级错误,希望大家指正,也希望能对 Erlang 爱好者们有帮助。第五部分:binary。 阅读全文
posted @ 2013-12-01 18:15 siyao 阅读(5407) 评论(6) 推荐(1) 编辑
摘要:本系列介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现。了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数据类型。本文对 Erlang 数据类型及实现的总结目前是最全面的,可以作为 Erlang 数据结构的参考手册。尽管我写的内容都试图在各种参考资料和 Erlang 虚拟机源代码中验证,但是难免会有理解错误或各种低级错误,希望大家指正,也希望能对 Erlang 爱好者们有帮助。第四部分:boxed 对象。 阅读全文
posted @ 2013-12-01 18:12 siyao 阅读(3333) 评论(3) 推荐(0) 编辑
摘要:本系列介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现。了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数据类型。本文对 Erlang 数据类型及实现的总结目前是最全面的,可以作为 Erlang 数据结构的参考手册。尽管我写的内容都试图在各种参考资料和 Erlang 虚拟机源代码中验证,但是难免会有理解错误或各种低级错误,希望大家指正,也希望能对 Erlang 爱好者们有帮助。第三部分:列表。 阅读全文
posted @ 2013-11-15 00:41 siyao 阅读(3087) 评论(7) 推荐(0) 编辑
摘要:本系列介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现。了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数据类型。本文对 Erlang 数据类型及实现的总结目前是最全面的,可以作为 Erlang 数据结构的参考手册。尽管我写的内容都试图在各种参考资料和 Erlang 虚拟机源代码中验证,但是难免会有理解错误或各种低级错误,希望大家指正,也希望能对 Erlang 爱好者们有帮助。第二部分:Eterm 和立即数 阅读全文
posted @ 2013-11-15 00:40 siyao 阅读(3945) 评论(1) 推荐(0) 编辑
摘要:本系列介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现。了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数据类型。本文对 Erlang 数据类型及实现的总结目前是最全面的,可以作为 Erlang 数据结构的参考手册。尽管我写的内容都试图在各种参考资料和 Erlang 虚拟机源代码中验证,但是难免会有理解错误或各种低级错误,希望大家指正,也希望能对 Erlang 爱好者们有帮助。第一部分:Erlang 数据类型回顾。 阅读全文
posted @ 2013-11-15 00:38 siyao 阅读(2574) 评论(1) 推荐(0) 编辑
摘要:本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang 运行时中提供的一个通用无锁队列的实现及其在 ERTS 异步线程池中的应用。 阅读全文
posted @ 2013-10-30 00:08 siyao 阅读(3690) 评论(6) 推荐(3) 编辑
摘要:一篇从调度原理的角度探讨为什么Erlang能做到低延迟的文章的译文。 阅读全文
posted @ 2013-10-21 20:56 siyao 阅读(11634) 评论(2) 推荐(3) 编辑
摘要:线程进度机制是Erts 5.9引入的一项性能改进,是Erlang运行时面向多核处理器的优化措施之一。线程进度机制可以跟踪所有受管的线程的进度,以此判断线程是否完成了某个进度点的执行。Erlang运行时中的系统阻塞功能被新的基于这项机制的系统阻塞功能替代。基于这项机制,Erlang运行时还实现了无锁的同步数据结构,未来Erlang运行时会越来越多地采用无锁数据结构。本文分析了这项机制的基本原理,详细分析了运行时中相关的数据结构和源代码,还分析了全新系统阻塞功能的实现。 阅读全文
posted @ 2013-01-27 00:54 siyao 阅读(3930) 评论(1) 推荐(3) 编辑
摘要:本文介绍了Erts中使用的读写锁(rwmutex)的原理和实现。在R14B中,Erts的读写锁进行了一次重要的性能更新,本文对这一次更新的优化进行了描述。此外还简单介绍了一下代码中使用的基本模式。 阅读全文
posted @ 2013-01-16 22:43 siyao 阅读(1027) 评论(1) 推荐(0) 编辑
摘要:本文介绍了Erlang运行时ERTS中提供的各种原子操作,介绍了由于处理器乱序执行给多线程程序同步带来的问题和解决方法,分析了ERTS将原子操作和内存屏障结合的设计,最后简单地剖析了相关的API代码设计。 阅读全文
posted @ 2012-11-02 22:24 siyao 阅读(3675) 评论(0) 推荐(1) 编辑
摘要:本文从源代码出发简单地分析从在控制台输入erl按下回车到init完成启动步骤的过程。 阅读全文
posted @ 2012-08-15 23:55 siyao 阅读(8852) 评论(4) 推荐(4) 编辑
摘要:Erlang R15的一项新特性是可以通过DTrace或Systemtap跟踪虚拟机中的各种行为(参见 http://blog.yufeng.info/archives/2198)。通过这些跟踪信息可以从旁观者的角度窥探到Erlang的工作原理。编写了一个小程序,把跟踪信息画出来,如下图所示。这个跟踪的跟踪对象是一个名为random的benchmark程序。random创建出N个进程,每个进程随机生成100000个整数,然后对这些整数进行排序,再将排序后的列表分为两半,将第二半的第一个数,即整个整数列表的中位数,通过消息发送给主进程。很明显这是一个并行度为N的计算密集型任务,每一个并行任务之间 阅读全文
posted @ 2012-06-12 22:46 siyao 阅读(1248) 评论(0) 推荐(0) 编辑