自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(24)
  • 收藏
  • 关注

转载 Erlang 虚拟机内的内存管理(Lukas Larsson演讲听写稿)

Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例:http://www.erlang-factory.com/conference/show/conference-6/home/#lukas-larsson在这里可以下载slides和观看视频(为了方便不方便科学上网的同学,我...

2014-05-03 12:01:00 253

转载 Erlang 虚拟机 BEAM 指令集之内存管理相关的指令

翻看 BEAM 虚拟机指令集的时候(在编译器源码目录下:lib/compiler/src/genop.tab),会发现有一些和内存分配/解除分配相关的指令,如下所示:allocate StackNeed Liveallocate_heap StackNeed HeapNeed Liveallocate_zero StackNeed Liveallocate_heap...

2014-03-26 23:31:00 180

转载 Erlang 的新数据结构 map 浅析

更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正。应该用 := 匹配字段,而不是 => 。即将发布的 Erlang 17 最大变化之一包括新的数据结构 map 的引入。其他很多动态语言,都在语言层面原生地支持映射的数据结构,因此在写程序的时候随手需要表示一个类似对象结构这样的映射数据非常方便。Erlang 原来也有一个类似的结...

2014-03-09 23:25:00 193

转载 Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题。本文首先简单介绍脏调度器机制的用法,然后简要分析虚拟机中的实现原理,最后讨论了一下脏调度器的局限性。脏调度器机制的用法了解 NIF 的同学都知道,在 Erlang 虚拟机的层面,NIF 调用是不会被抢占的,在执行 NIF 的...

2014-02-15 23:54:00 157

转载 Erlang 程序引发共享内存 bug 的一个例子

虽然 Erlang 的广告说得非常好,functional、share-nothing、消息传递,blah blah 的,好像用 Erlang 写并发程序就高枕无忧了,但是由于 Erlang 信奉高度实用主义的哲学,所以 Erlang 中有各种各样的后门,使得 Erlang 是一个不那么 pure 的 functional 语言,而且也是允许 share something 的。比如...

2014-01-21 07:43:00 158

转载 为什么Erlang比C慢那么多倍?

Erlang 一直以慢“著称”,本文就来看看 Erlang 慢在什么地方,为什么比实现同样功能的 C 语言程序慢那么多倍。Erlang 作为一种虚拟机解释的语言,慢是当然的。不过本文从细节上分析为什么 Erlang 这种虚拟机语言会慢。本文从 shootout benchmark[注1]中选择了一个 Erlang 和 C 语言单核性能差距最大的例子——reverse compleme...

2013-12-22 16:51:00 230

转载 Profile 分析 Erlang 虚拟机源码时要注意的一个问题

最近用 Intel Vtune 剖析 Erlang 虚拟机的运行,想看看那些函数和语句耗时最多,遇到一个小问题,那就是 Vtune 给出的源码和汇编码对应有问题。这个问题在 profile 或 debug 其他程序的时候也有可能会碰到的。看下面的例子,运行 dialyzer 的时候用 Vtune 进行采样,然后看结果:很自然,process_main 函数耗时最多,是 CPU...

2013-12-07 23:48:00 101

转载 Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例

最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的场景示例参见这篇博文)。而上下文是调度器内部私有的全局变量。而我们一直在说,Erlang 调度器是抢占式调度器,进程耗光了 reduction 配额之后就会被抢占,那么调度器是怎么保证不可重...

2013-12-01 22:47:00 99

转载 Erlang数据类型的表示和实现(5)——binary

binary 是 Erlang 中一个具有特色的数据结构,用于处理大块的“原始的”字节块。如果没有 binary 这种数据类型,在 Erlang 中处理字节流的话可能还需要像列表或元组这样的数据结构。根据之前对这些数据结构 Eterm 的描述,数据块中的每一个字节都需要一个或两个机器字来表达,明显空间利用率低,因此 binary 是一种空间高效的表示形式。在 binary 对字节序列...

2013-12-01 18:15:00 673

转载 Erlang数据类型的表示和实现(4)——boxed 对象

Boxed 对象Boxed 对象是比较复杂的对象,在 Erlang 中主标签为 10 的 Eterm 表示一个对 boxed 对象的引用。这个 Eterm 除去标签之后剩下的实际上是一个指针,指向具体的 boxed 对象。如下图所示,boxed 对象由对象头和具体的数据组成,这些字都排布在一起,占用进程栈中的一段连续空间(不像列表那样会分开)。对象头分为 3 部分:主标签固...

2013-12-01 18:12:00 200

转载 Erlang数据类型的表示和实现(3)——列表

列表Erlang 中的列表是通过链表实现的,表示列表的 Eterm 就是这个链表的起点。列表 Eterm 中除去 2 位标签 01 之外,剩下的高 62 位表示指向列表中第一个元素的指针的高 62 位。我们在生成一个列表的时候,会采用这样的语法:L = [Head | Tail],Head 表示要添加到头部的单个元素,Tail 表示另一个列表。这种 Head 和 Tail 的组合称为...

2013-11-15 00:41:00 222

转载 Erlang数据类型的表示和实现(2)——Eterm 和立即数

Erlang 数据类型的内部表示和实现Erlang 中的变量在绑定之前是自由的,非绑定变量可以绑定一次任意类型的数据。为了支持这种类型系统,Erlang 虚拟机采用的实现方法是用一个带有标签的机器字表示所有类型的数据,这个机器字就叫做 term。在 32 位机器上,一个 term 为 32 位宽;在 64 位机器上,一个 term 默认为 64 位宽[注2]。由于目前大规模的服务器基...

2013-11-15 00:40:00 243

转载 Erlang数据类型的表示和实现(1)——数据类型回顾

本文介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现。了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数据类型。本文对 Erlang 数据类型及实现的总结目前是最全面的,可以作为 Erlang 数据结构的参考手册。尽管我写的内容都试图在各种参考资料和 Erlang 虚拟机源代码中验证,但是难免...

2013-11-15 00:38:00 179

转载 Erlang运行时中的无锁队列及其在异步线程中的应用

本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang 运行时中提供的一个通用无锁队列的实现及其在 ERTS 异步线程池中的应用。无锁队列在 ERTS 中的应用场合为了提升 Erlang 运行时在多核/众核处理器上的 scalabili...

2013-10-30 00:08:00 221

转载 Erlang的调度原理(译文)

原文http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html免爬墙链接http://www.dikutal.dk/blog/jlouis/how-erlang-does-schedulingJesper Louis Andersen,2013年1月12日我用这篇文章解释一...

2013-10-21 20:56:00 154

转载 MCS锁——可伸缩的自旋锁

在编写并发同步程序的时候,如果临界区非常小,比如说只有几条或几十条指令,那么我们可以选择自旋锁(spinlock)。使用普通的互斥锁会涉及到操作系统的调度,因此小临界区一般首选自旋锁。自旋锁的工作方式就是让竞争的线程不断地读取一个变量的状态,判断是否满足可以进入临界区的条件。最简单的自旋锁应该如何实现?假设我们用一个布尔变量表示临界区是否被占用,true表示被占用,false表示没有...

2013-10-19 17:35:00 172

转载 The Art of Multiprocessor Programming读书笔记 (更新至第3章)

这份笔记是我2013年下半年以来读“The Art of Multiprocessor Programming”这本书的读书笔记。目前有关共享内存并发同步相关的书籍并不多,但是学术文献却不少,跨越的时间范围也非常长,说明人们一直在做出努力。这本书是这个领域的好书,作为一本好书,它总结了这个领域自发展以来的大量重要成果,介绍了共享内存同步的基本理论,并介绍了大量并发算法和数据结构(主要是无...

2013-10-17 11:02:00 157

转载 Erlang运行时源码分析之——线程进度机制

欢迎下载本文精美排版的的pdf版本:http://vdisk.weibo.com/s/oIICP1 概述线程进度跟踪机制(thread progress)是Erts 5.9引入的一个重要的内部改进,如release notes中提到的:The ERTS internal system block functionality has been re...

2013-01-27 00:54:00 105

转载 Erlang 运行时中使用的读写锁解析

本文介绍了Erts中使用的读写锁(rwmutex,或称为rwlock)的原理和实现。在R14B中,Erts的读写锁进行了一次重要的性能更新,本文对这一次更新的优化进行了描述。此外还简单介绍了一下代码中使用的基本模式。相比互斥锁,读写锁为临界区提供了一种粒度更细的锁机制。当有读者获得了读锁的时候, 那么所有读者线程都可以并发获得读锁,但是写者不能获得写锁。当写者获得了写锁的...

2013-01-16 22:43:00 300

转载 经典互斥算法解析

本文用较为轻松的方式介绍了几个经典的互斥算法: Dekker 算法、Dijkstra 提出的算法、Peterson 算法和面包店算法,并简单地给出了每一个算法的正确性证明和相关的讨论。本文探寻分布式计算历史上的几个非常有名非常经典的互斥算法,尽管这些算法几乎是所有操作系统、分布式系统或多线程编程课本中必介绍的算 法,可是由于这些算法由于性能问题已经被现代的算法或机制替代了,实际中不会有人...

2013-01-04 16:47:00 495

转载 Erlang运行时中的原子操作

Erlang运行时提供的原子操作API尽管Erlang给开发人员提供的语义是基于消息传递式的同步,对于应用开发者来说,使用这种语义可以避免使用锁;但是在Erlang运行时(ERTS)中,为了充分利用多核处理器中多个处理器核心,Erlang运行时采用了多线程的结构,例如一个调度器就运行在一个线程中,因此Erlang运行时本身也是一个多线程应用程序。目前大部分多核处理器都采用共享内存的架...

2012-11-02 22:24:00 209

转载 Erlang启动过程分析

本文从源代码出发简单地分析从在控制台输入erl按下回车到init完成启动步骤的过程。本文分析的环境为Unix环境,Erlang/OTP版本为R15B01,针对的虚拟机为SMP风格的虚拟机(也就是在代码中定义ERTS_SMP宏)。Erlang虚拟机的启动erl实际上是一个shell脚本,设置几个环境变量之后,调用执行erlexec。erlexec的入口点在 otp_src_R15B...

2012-08-15 23:55:00 310

转载 Erlang调度器一窥

Erlang R15的一项新特性是可以通过DTrace或Systemtap跟踪虚拟机中的各种行为(参见 http://blog.yufeng.info/archives/2198)。通过这些跟踪信息可以从旁观者的角度窥探到Erlang的工作原理。编写了一个小程序,把跟踪信息画出来,如下图所示。这个跟踪的跟踪对象是一个名为random的benchmark程序。random创建出N个进程...

2012-06-12 22:46:00 91

转载 测试服务器最大内存带宽的实验

介绍Intel Nehalem架构处理器内建了内存控制器,处理器之间通过QPI互联,是典型的NUMA系统。NUMA系统的特点是每一个节点都有自己的内存控制器,尽管每个节点都能访问所有节点上的内存,但是代价不一样,访问本地内存的速度比访问远程节点的速度要快。使用Intel Nehalem架构的处理器时,如果一个节点需要访问另一个节点的内存,那么数据需要通过CPU的QPI通道访问,因此会...

2012-06-12 21:12:00 385

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除