在具体分析erlang进程的调度和执行过程前,我们需要简单的了解下erlang虚拟机的指令集的几种形式。
Erlang程序beam文件是需要虚拟机解释执行的字节码文件,因此Erlang的进程结构不同于普通的操作系统进程,Erlang的所有进程数据包括代码,堆栈结构都是存放在数据区里,Erlang进程并没有普通进程拥有的代码区。Erlang进程的stack结构包含了函数调用帧的临时变量和返回地址,heap包含了Erlang进程执行过程中创建的数据。Erlang进程的堆栈总是同时被分配的,并且始终是在同一块区域,并且栈顶和堆顶都朝对方相向增长,当栈顶和堆顶相遇了,就进行垃圾回收。堆的大小增长在一定范围内是按Fibonacci数列增长。
每个Erlang的call frame在栈中都是以一个返回地址开始,后面紧跟是临时变量。每个Erlang的term用一个32位的unsigned word类型数据代表,每个term包含值和一个tag,tag占用4位,并且存在最小有效位中,tag用来标识term的类型,tag的定义如图2.1.1:
图2.1.1
The BEAM Virtual Machine uses the following registers:
HTOP - top-of-heap pointer
E - top-of-stack pointer
CP - return-address pointer (where to go when a function is ready executed)
I - next-instruction pointer
x(N) - argument registers (to pass function parameters), x(N) are also used to hold temporal variables
y(N) - local variables (y(N) are not real registers, they reside in a local frame and are accessed by integer offset from a top-of-stack pointer)
fcalls - number of reductions done (to check for suspension while doing function call)
Erlang源程序文件在经过编译后生成对应的字节码文件,其格式为:
在这种格式中的opcode_value小于255的占用一个字节,大于255的将占用两个字节。
字节码语法图形式比较复杂,操作数按他们的类型大致可以分为以下几种:
8-bit long
- magic number
- function arity
- type of arithmetic
- type of operand
- type of bif
- sign of bignumber value
16-bit long
- atom length
- float length
- code length
- register number
- frame size
- heap requirement
24-bit long
- relative address
32-bit long
- integer value
- code size
- tuple arity
- tuple index
- string length
- bignum arity
- bignum value
除此之外,其它的操作数都是16位长。
然后字节码文件不能被直接执行,需要由erlang虚拟机解释执行。Erlang虚拟机加载字节码文件后会将字节码映射成虚拟机能识别的指令集,虚拟机指令集是使用C代码来定义的,称为threaded-code。其格式如下:
threaded-code的每一行都占用4个字节。threaded-code的定义在process_main()函数中。
Erlang虚拟机的指令集十分强大,除了普通的运算指令集还有丰富的Test Instructions、Exception Handling以及进程间消息通信的Send,Receive原语。除此之外,Erlang虚拟机还提供了丰富的内建函数功能,内建函数主要是对那些访问频繁的函数进行优化处理。关于Erlang虚拟机指令集的详细说明,请参见这篇论文:The Erlang BEAM Virtual Machine Specification。
相关推荐
Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例 根据siyao zheng博客上听写的资源进行的翻译,大致只翻译了80%但核心部分已经完整,希望对大家...
hex, Erlang虚拟机的软件包管理器 十六进制 Hex是Erlang虚拟机的软件包管理器。这个项目目前提供了与混合。tcm 工具构建的任务。有关安装说明和其他文档,请参阅 hex.pm 。在本地安装十六进制以进行开发: mix ...
erlang 程序设计 源码 erlang 程序设计 源码 erlang 程序设计 源码erlang 程序设计 源码
erlang 部分源码, 虽然不是很全,但是大部分都有。 erlang 部分源码
英雄远征服务器端erlang源码,用mysql数据库
基于Erlang VM的语言基于Erlang基于Erlang VM的语言 VM的语言基于Erlang VM的语言
erlang21.0源码。! erlang21.0源码。!erlang21.0源码。!erlang21.0源码。!
Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,...
erlang server源码 一个聊天室服务器源码
erlang具有良好的高并发性 支持热更新 本代码适合初学者更快的上手
本书由Erlang之父Joe Armstrong编写,是毋庸置疑的经典著作。书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用...
远古封神Server(erlang源码)+文档+mongodb数据库 远古封神Server(erlang源码)+文档+mongodb数据库
erlang 聊天室源代码,初学者项目,花了两周时间完成,其中设计参考的是著名聊天软件rabbitMQ 的部分模块
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
erlang源码安装包,此安装包是linux环境下的;erlang的版本是5.10.3
erlang程序设计(第二版)随书源码,绝对完整,你值得拥有
附有需求文档,设计文档,以及一些说明文档,简单的聊天室功能,适合初学者阅读,是本人学习erlang过程中写的,参照了rabbitMQ的核心模块
远古封神Server(erlang源码)+文档+mongodb数据库