diaojing4186
码龄8年
关注
提问 私信
  • 博客:7,065
    7,065
    总访问量
  • 暂无
    原创
  • 1,417,184
    排名
  • 6
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:法国
  • 加入CSDN时间: 2017-03-24
查看详细资料
个人成就
  • 获得1次点赞
  • 内容获得0次评论
  • 获得8次收藏
  • 博客总排名1,417,184名
创作历程
  • 5篇
    2014年
  • 15篇
    2013年
  • 4篇
    2012年
创作活动更多

王者杯·14天创作挑战营·第2期

这是一个以写作博客为目的的创作活动,旨在鼓励码龄大于4年的博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。 注: 1、参赛者可以进入活动群进行交流、分享创作心得,互相鼓励与支持(开卷),答疑及活动群请见https://bbs.csdn.net/topics/619735097 2、文章质量分查询:https://www.csdn.net/qc 我们诚挚邀请你们参加为期14天的创作挑战赛!

66人参与 去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

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 ·
350 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

Erlang 的新数据结构 map 浅析

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

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

翻看 BEAM 虚拟机指令集的时候(在编译器源码目录下:lib/compiler/src/genop.tab),会发现有一些和内存分配/解除分配相关的指令,如下所示:allocate StackNeed Liveallocate_heap StackNeed HeapNeed Liveallocate_zero StackNeed Liveallocate_heap...
转载
发布博客 2014.03.26 ·
261 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 ·
196 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

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

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

MCS锁——可伸缩的自旋锁

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

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

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

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 ·
159 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

Erlang运行时中的原子操作

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

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

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

Erlang启动过程分析

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