在具体分析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 ...
BEAM是Erlang虚拟机的缩写,它是Erlang程序运行的基础。BEAM虚拟机执行Erlang字节码,提供了垃圾回收、内存管理等功能。在源码中,你可以找到关于字节码解释器、垃圾收集算法的实现。 3. **模块和函数** Erlang...
7. **学习路径**:初学者可以通过阅读和调试这些源码,了解Erlang的基本语法、模块结构、进程通信以及数据库操作。同时,也可以研究其错误处理和日志记录机制,以增强对Erlang实际开发流程的理解。 8. **实践经验**...
Erlang是一种面向并发的、动态类型的编程语言,主要用于构建分布式、容错性强的系统。OTP(Open Telecom ...同时,对于研究分布式系统、并发编程或者虚拟机设计的人来说,Erlang 21.0的源码也是一个宝贵的教育资源。
Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,...
在本项目中,我们看到"erlang 聊天室源码"是一个初学者级别的实践项目,开发者花费了两周时间完成,并且在设计上受到了知名消息中间件rabbitMQ的启发。 首先,我们要理解Erlang的核心特性,这包括轻量级进程...
Erlang是一种面向并发的、动态类型的编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。...在`code`这个文件中,你可以找到实际的源码,通过阅读和分析,将理论知识与实践相结合,提升对Erlang编程的掌握。
erlang 服务端代码 例子,演示了如何管理角色
《英雄远征》是一款基于Erlang编程语言开发的网络游戏,其源码的公开为开发者提供了深入了解游戏服务端架构和Erlang在大型分布式系统应用的机会。Erlang是一种为并发、容错和实时系统设计的函数式编程语言,以其在高...
【标题】:“英雄远征erlang源码”指的是一个基于Erlang编程语言开发的服务器端源代码,用于支持网络游戏“英雄远征”的运行。Erlang是一种并发性极强、容错性好的函数式编程语言,常用于构建高可用性的分布式系统,...
- **BEAM虚拟机**:Erlang程序运行在BEAM(Berkeley ERLang)虚拟机上,它设计为高效处理并发和容错。 - **进程模型**:Erlang采用轻量级进程模型,进程间通信快速且高效,支持分布式计算。 - **模式匹配**:Erlang...
**Erlang聊天室源码解析** Erlang是一种面向并发的编程语言,因其在分布式系统和高可用性服务中的出色表现,常被用于构建消息队列如RabbitMQ这样的项目。本篇将深入探讨一个基于Erlang实现的简单聊天室源码,帮助...
Erlang Server源码分析与详解 Erlang是一种面向并发的、函数式编程语言,以其在分布式系统、高可用性和容错性方面的优势而受到广泛关注。尤其在构建大规模聊天室服务器这样的实时通信系统中,Erlang的性能表现突出...
6. 完整的项目代码,学习者可以通过阅读和修改代码来加深理解和实践Erlang的应用。 鉴于标签栏为空,我们无法获知该项目的特定领域或主题。然而,基于Erlang的特性,可以推测该项目可能会涉及到高性能网络服务器的...
《远古封神Server:基于Erlang的服务器架构与MongoDB数据库集成解析》 本文将深入探讨"远古封神Server"项目,这是一个采用Erlang编程语言构建的游戏服务器,搭配MongoDB数据库来实现高效的数据存储和处理。Erlang以...
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
源码中可能包含BEAM虚拟机的部分实现,帮助我们理解Erlang程序的执行过程。 7. OTP(开放电信平台)框架:OTP提供了许多预定义的行为和库,如gen_server、gen_event等,用于构建可靠的服务。通过源码,我们可以看到...
星光项目是一个正在进行的工作(WIP),它旨在使用Rust编程语言实现一个Erlang虚拟机的替代品。这个项目不仅关注于提供一个高效的运行环境,同时也致力于利用Rust的安全特性和现代编译器技术,来构建一个更强大、更...