把之前阅读资料的时候记下的东西,整理了一下.

Adding special-purpose processor support to the Erlang VM

 

P23 简单介绍了Erlang Compiler和Beam文件格式;

The Erlang Compiler in short 章节提到了 Core Erlang 这个之前有提到过:

[Erlang 0120] Know a little Core Erlang

http://www.cnblogs.com/me-sa/p/know_a_little_core_erlang.html

Erlang Beam Format

Python module to parse Erlang BEAM files.

https://github.com/matwey/pybeam

P26 3.4 The Erlang Virtual Machine

Joe Armstrong设计的JAM是Stack based machine,现在的BEAM是register based machine.

Beam Loader的章节,解决了之前的很多困惑:

BEAM Loader作为VM的一部分其职责就是加载BEAM文件中的代码.BEAM文件使用的是所谓有限指令集( limited instruction set),这一指令集会在运行时由BEAM Loader展开为扩展指令集(extended instruction set).使用两种指令集的原因是让BEAM文件小一点; BEAM加载逻辑在beam_load.c文件中完成,emulator使用beam_opcodes.c文件中的load scripts将有限指令集转换成为扩展指令集;Perl脚本beam_makeops读取文件ops.tab作为输入生成beam_opcodes.c文件.有限指令集在genop.tab.

上面提到的文件所在路径:

beam_makeops erts/emulator/utils/

ops.tab erts/emulator/beam/

beam_opcodes.c erts/emulator/<machine>/opt/smp/

beam_load.c erts/emulator/beam/

genop.tab lib/compiler/src/

  

文件beam_opcodes.c是在Erlang编译期生成的.

Exploring Alternative Memory Architectures for Erlang:Implementation and Performance Evaluation
 
 
这个在之前的学习Erlang垃圾回收机制的时候参考过,这里不再重复:
Private Heap 主要的问题在于消息发送都是通过拷贝实现的,这是进程通信的主要消耗,特别是消息体特别大的时候.  http://www.erlang.se/doc/programming_rules.shtml 里面提到:
“Processes are the basic system structuring elements. But do not use processes and message passing when a function call can be used instead.” 

这也就是小消息大运算背后的原因.

@cnDenis   提到的霸爷的文章  量化Erlang进程调度的代价


Heap Architectures for Concurrent Languages using Message Passing


地址: http://www.fantasi.se/publications/ISMM02.pdf

摘要: We describe how interprocess communication and garbage collection happens in each architecture, and extensively discuss the tradeoffs that are involved. In an implementation set-
ting (the Erlang/OTP system) where the rest of the runtime system is unchanged, we present a detailed experimental comparison between these architectures using both synthetic programs and large commercial products as benchmarks.
备注: 一句话总结这篇论文就是:当消息传递的时候本质上发生了什么

P3

Stack用来存放function arguments, return addresses, and local variables.复合数据结构(Compound terms)比如 lists, tuples, 以及超过一个机器字长的浮点数或者bignums都会在heap存放.stack和heap向对方区域增长,这样做的好处是很容易做溢出检测,只要比较一下stack和heap的指针即可,这样设计的缺点是stack或heap的一个内存区域的重新分配会同时影响stack和heap两块区域.Erlang还支持大块的二进制数据,这种数据不是在heap存储而是在单独的全局内存区域存储并进行引用计数.

消息传递是通过拷贝完成的,从sender的heap拷贝到receiver的heap;然后把指向这个消息的指针插入到receiver的mailbox,mailbox包含在进程的PCB内.下面的图

P1进程内有一些共享的数据部分在拷贝的过程中会被展开,这种情况下拷贝之后的消息就要比之前的消息占用更大空间,这种情况实际情况很少发生.这种情况是可以通过跟踪手段(marking technique)和转向指针( forwarding pointers)来规避,但是这样可能让消息通信更慢.

关于forwarding pointer的资料:

http://www.memorymanagement.org/glossary/f.html#glossary-f

forwarding pointer
Some garbage collectors move reachable objects into another space. They leave a forwarding pointer, a special reference pointing to the new location, in the old location.

The following difference between the two memory architectures also deserves to be mentioned: In a process-centric system, it is easy to impose limits on the space resources that a particular (type of) process can use. Doing this in a shared heap system is significantly more complicated and probably quite costly. Currently, this ability is not required by Erlang.

Efficient memory management for concurrent programs that use message passing I,II

地址: http://user.it.uu.se/~kostis/Papers/scp_mm.pdf

备注: 这其实是一个论文集

P13 1.3 Improving message passing
In the private heap architecture, the send operation consists of three parts:
1. Calculate the size of the message to allocate space in the receiver’s heap;
2. copy the message data to the receiver’s heap; and finally,
3. deliver the message to the receiver’s message queue.

To reduce the complexity of the send operation, we want to remove the parts of the send whose cost is proportional to the message size, namely 1 and 2. By introducing a new memory architecture, where all process-local heaps are replaced by a shared memory area, we can achieve this and reduce the cost of sending messages to O(1), that is, make it a constant time operation. We call this the shared heap architecture.

An introduction to Core Erlang
地址: http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=1C8691982F56D28905DAC4D731A386C7?doi=10.1.1.20.7146&rep=rep1&type=pdf

备注: 简单描述Core Erlang 和Erlang的关系,发展历史 从Erlang代码到Core Erlang代码中间经历的分析和转换过程中是怎样被大大简化的.

这个之前有详细了解过, [Erlang 0120] Know a little Core Erlang http://www.cnblogs.com/me-sa/p/know_a_little_core_erlang.html

 

 

All you wanted to know about the HiPE compiler (but might have been afraid to ask)
备注:几乎解答了HIPE的所有常见问题

[Erlang 0078] Erlang HiPE 二三事 http://www.cnblogs.com/me-sa/archive/2012/10/09/erlang_hipe.html

 
首先Erlang/OTP compiler完成宏预处理,解析,把一些语法糖还原,之后代码重写成Core Erlang的形式.在Core Erlang环节会完成各种优化比如常量展开(constant folding),函数inline等等.之后代码重写成为BEAM 虚拟机代码,这个环节还有一些优化. 
 
 
1> c(my module, [native]).

compile:file(my module, [native])

erlc +native my module.erl

erlc +native +’{hipe,[verbose]}’ my module.erl

  

Generating native code and loading it on-the-fly into the system is possible even in cases when the Erlang source code is not available but the .beam file (containing BEAM bytecode) exists. This can be done for whole modules using:

hipe:c(my module)

hipe:c({M,F,A}). 

3> c(my module, [native, {hipe, [verbose, o3]}]).

c(my module, [native, core]).  %% Compilation from Core Erlang

  

警告:

Do not use the -compile(export_all) directive. This reduces the likelihood of functions being inlined, and makes useful type analysis impossible.

[Erlang 0129] Erlang 杂记 VI的更多相关文章

  1. [Erlang 0124] Erlang Unicode 两三事 - 补遗

    最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本 ...

  2. [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集

    虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/   ...

  3. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  4. Erlang 103 Erlang分布式编程

    Outline 笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明 2014-11-23 A Outl ...

  5. [Erlang 0057] Erlang 排错利器: Erlang Crash Dump Viewer

    http://www.cnblogs.com/me-sa/archive/2012/04/28/2475556.html Erlang Crash Dump Viewer真的是排错的天兵神器,还记得我 ...

  6. [Erlang 0118] Erlang 杂记 V

       我在知乎回答问题不多,这个问题: "对你职业生涯帮助最大的习惯是什么?它是如何帮助你的?",我还是主动回答了一下.    做笔记 一开始笔记软件做的不好的时候就发邮件给自己, ...

  7. [Erlang 0123] Erlang EPMD

     epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢?   epmd 是Erlan ...

  8. [Erlang 0119] Erlang OTP 源码阅读指引

      上周Erlang讨论群里面提到lists的++实现,争论大多基于猜测,其实打开代码看一下就都明了.贴出代码截图后有同学问这代码是哪里找的?   "代码去哪里找?",关于Erla ...

  9. [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集

    Erlang Resources 小站 2013年7月~12月资讯合集,方便检索.     附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集    小站地 ...

随机推荐

  1. .NET 基础一步步一幕幕[out、ref、params]

    out.ref.params out: 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组. 但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候, 我们可以考虑使用 ...

  2. 微信小程序开发调试工具

    为了帮助开发者简单和高效地开发微信小程序,我们推出了全新的 开发者工具 ,集成了开发调试.代码编辑及程序发布等功能. 扫码登录 启动工具时,开发者需要使用已在后台绑定成功的微信号扫描二维码登录,后续所 ...

  3. AngularJs之八

    ***今天讲一下angularJs的路由功能: 一:angularJs路由. 1.AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 2.通过 AngularJS 可以实现多视图的单 ...

  4. PHP_VERSION_ID是如何定义的

    PHP_VERSION_ID是一个整数,表示当前PHP的版本,从php5.2.7版本开始使用的,比如50207表示5.2.7.和PHP版本相关的宏定义在文件 phpsrcdir/main/php_ve ...

  5. 压缩SWF文件大小!减少40%体积!

     使用FlashBuild作为IDE的痛苦是显著的!如果开发的项目比较大,那么卡顿.崩溃.白屏是常事,使用别的IDE开发如Sublime.FlashDevelop.IDEA等,然后再用mxmlc编译出 ...

  6. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇四:关于OneNote入库处理以及审核

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  7. jquery dataTable汉化(插件形式)

    1.jquery dataTable.js 官网:http://datatables.net/ 中文:http://dt.thxopen.com/ 2.汉化提示信息(放到xx.js中,引入即可) 注: ...

  8. 不得不吐槽的Android PopupWindow的几个痛点(实现带箭头的上下文菜单遇到的坑)

    说到PopupWindow,我个人感觉是又爱又恨,没有深入使用之前总觉得这个东西应该很简单,很好用,但是真正使用PopupWindow实现一些效果的时候总会遇到一些问题,但是即便是人家的api有问题, ...

  9. 在idea中maven项目jdk编译version总是跳到1.5

    bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5.0. 每次手动去setting里修改comp ...

  10. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...