group_leader的设计和用途
一直对erlang的group_leader这个概念很困惑,因为*nix系统也有类似的名词但是只是和进程组管理有关系。查了很多文档才知道,erlang的group_leader的设计意图和作用,解释如下: 先看下着段代码运作: log_group_leader(OGL) -> receive Msg -> io:format(user, "Got message ~p~ ...
Async线程pool及其作用
erlang能够利用多核心cpu的基础设施有2个 1. 进程调度器 2. async 线程池。 其中 async 线程池主要设计用来 能够在driver里面异步的执行费时操作, 因为driver是在调度器里面调用的 不过费时操作的话 会block掉整个调度器 而且调度器资源有限。 细节参见 erl_async.c Driver API: Asynchronous calls The lat ...
Erlang分布的核心技术浅析
Erlang系统在我看来有3个特性 1. 分布 2. 多核心支持 3. fp。 这这3个特性中分布我认为是erlang最强大的,从第一个版本就支持到现在,相对非常成熟,而多核心支持是这几年才加进去的。 erlang的分布系统做到了2点 1.节点的位置无关性。 2. 对用户分布式透明的。具体体现就是node是靠名字识别的, 进程也是靠pid来识别。 分布系统就要实现节点间通讯,erlang也不列外 ...
erlang内置的port相关的驱动程序
erlang能够利用多核心的优势不仅体现在多线程的smp调度器,更在port上面上体现。通过执行外部程序,接管它的输入输出, 实现了安全性和充分利用cpu计算资源。 erlang的io设计体现了unix一切以文件为中心的思想。在port设计上也是.这3个驱动程序都是把相关的东西转化成文件句柄,登记到poll上面,利用强大的IO poll来实现上层语义的整合。 ErlDrvEntry spawn ...
smp下async_driver的用途和匠心
/* INTERNAL use only */ struct erl_drv_entry async_driver_entry; erlang beam里面有个async_driver设计的比较有意思。 在多处理器beam里面,线程间需要通讯。常规的情况下用condition再有个队列之类的辅助。 但是这个设计不能充分利用io的优势,而且使用起来很麻烦。async_driver就是设计给这个用途的 ...
erlang的timer和实现机制
对于任何网络程序来讲,定时器管理都是重头戏。erlang更是依赖于定时器。基础的timer主要是由time.c erl_time_sup.c实现。timer是基于time wheel的实现,支持time jump detection and correction。 上层的erl_bif_timer.c io.c中实现。 erl +c Disable compensation for sudden ...
erlang的IO调度
erlang的调度有2种: 1. 进程调度 2. IO调度。网络程序的事件来源基本上只有2种:IO和定时器。IO事件有可能是大量的, 不可预期的,所以在设计上要考虑和进程调度平衡。erlang的 erl_port_task就是为这个目标设计的。 poll检查到io时间的时候,会回调iread和oready函数。这2个会把这个队列加到porttask的调度队列去。 static ERTS_INLI ...
erlang运行期的自省机制
erlang运行期最值得称道的地方之一就是完备的自省机制,也就是说你可以通过这些信息了解整个系统运行的方方面面,给系统的调试,排错,调优,运营提供非常大的便利。在beam的c实现代码中至少1/4的代码在为这个目标服务,信息非常的到位详细,这和爱立信作为商业公司运营交换机的需求有很大的关系。自省分为2个层面的:提供erts运行期信息的和用户进程相关的信息。包括一下一个基础设施:system_flag, ...
erlang对port子进程退出的处理
erlang通过port来spawn外部程序 重定向外部程序的stdin, stdout到一对pipe行通信的,利用poll来检测外部程序的读写事件。但是如果外部程序退出的话,erts如何知道并且加以处理的呢? erts运行的时候会初始化smp_sig_notify,开启一个信号处理线程,在这个线程里面做具体的信号处理。 static void init_smp_sig_notify(void) ...
erlang的进程调度器工作流程
在多处理器机器上erlang默认是有几个cpu就有几个调度器线程,除非你通过+S N 参数来改变。每个调度器线程的入口函数是process_main, 外加一个主线程阻塞在select上等待中断事件的发生. process_main会调用schedule选择一个合适的process来执行。每个process里面都包含了要执行的的MFA,执行funtcion的opcode。beam_emu的opcod ...
erlang进程退出时清扫的资源
ERTS要终止一个经常的时候调用一下函数 void erts_do_exit_process(Process* p, Eterm reason) { ErtsLink* lnk; ErtsMonitor *mon; #ifdef ERTS_SMP erts_pix_lock_t *pix_lock = ERTS_PID2PIXLOCK(p->id); #endif p->ar ...
Erlang里的OO和Java里的OO
[Updated: Feb 18, 2007, 增加了关于Java中静态方法的内容] 首先,这里的OO中的Object仅指包含可变状态的Object,暂不涉及有关OO的多态、继承等概念。 一、Erlang的OO 1、保存在函数调用栈中的状态 Erlang是函数式语言,一般而言,对于事物可变的状态(参数和中间状态)尽可能局限在函数调用中处理完,在调用过程中这些状态全部保存在函数的调用堆栈中,也就是说 ...
Programming Erlang读书笔记1:Why Erlang?
公司产品终于上线了,一切告一段落,可以有大把时间看书写字了。 新年最令人激动事:可以开始系统的学习Erlang了! Erlang的书籍和教材还很少,《Programming Erlang》是Erlang的发明者Joe Armstrong自己写的学习Erlang的书,可谓经典 为什么要学习Erlang?现在还不知道,学完了才知道Erlang值不值得学。 搞程序的需要宗教信仰啊。 Five reaso ...
Programming Erlang读书笔记2:Getting Started
去http://www.erlang.org/download.html下载Windows版本的Erlang,将bin目录加入到系统path中 cmd进去输入erl回车,就进入Eshell了,输入q().或者Ctrl+C/Break可以退出Eshell(命令末尾加.然后回车才会执行函数) 在Eshell里输入help().可以看到命令列表(实际上是函数列表) 基于Debian的Linux系统下可 ...
Programming Erlang读书笔记3: Sequential Programming
module是Erlang代码的基本单元,我们写的所有function都存储在module里面,module存储在.erl文件里面 module编译成.beam文件后方可运行 在Erlang_HOME建立一个名为.erlang的文件: io:format("consulting .erlang in ~p~n", [element(2, file:get_cwd())]). ...
Programming Erlang读书笔记4: Exceptions
语法: try FuncOrExpressionSequence of Pattern1 [when Guard1] -> Expressions1; Pattern2 [when Guard2] -> Expressions2; ... catch ExceptionType: ExPattern1 [when ExGuard1] -> ExExpressions1; Exce ...
Programming Erlang读书笔记5: Advanced SP
所有的BIFs都属于erlang module,如erlang:tuple_to_list()、erlang:time(),但是大部分BIFs都auto-imported了,所以可以直接调用tuple_to_list()、time() erlang module的所有BIFs列表见:http://www.erlang.org/doc/man/erlang.html Binary是用来存储大量raw ...
Programming Erlang读书笔记6: 编译和运行Erl程序
启动和停止Eshell $ erl 1> halt(). 查看/添加代码查找路径 code:get_path(). code:add_patha(Dir). code:add_pathz(Dir). erl -pa Dir1 -pa Dir2 ... -pz DirK1 -pz DirK2 查看载入的module和查看出错的module code:all_loaded(). co ...
Programming Erlang读书笔记7: Concurrency
1, Erlang程序由许多进程组成,这些进程可以相互发送消息 2,这些消息可能接收并理解也可能不接收不理解,如果你希望消息被接收并理解,你必须等待应答 3,进程组可以连在一起,如果一组进程中的一个死掉,则该组的其他进程会收到一个说明那个进程为啥死掉的消息
Programming Erlang读书笔记8: Concurrency Programming
在Erlang里: 1,创建和销毁进程非常快 2,进程间发送消息非常快 3,在所有的操作系统间进程行为一致 4,可以有大量的进程 5,进程不共享内存并且完全独立 6,与进程交互的唯一途径是发送消息 Concurrency Primitives Pid = spawn(Fun) Pid!Message receive Pattern1 [when Guard1] -> Expressions ...
Programming Erlang读书笔记9: 并行程序里的错误
使用BIF link将两个节点连接起来,如果其中一个节点B退出,则另一个节点A会收到{'EXIT', B, Why}的信号 可以创建一个on_exit(Pid, Fun)方法来捕获某个Pid进程的死掉: on_exit(Pid, Fun) -> spawn(fun() -> process_flag(trap_exit, true), link(Pid), receive {'EXI ...
Programming Eralng读书笔记10: 分布式编程
分布式程序指设计用于运行在网络中的可以通过消息传递相互交流彼此的活动的计算机上的程序 分布式应用的好处:Performance、Reliability、Scalability、Intrinsically distributed application、Fun、 1, key-value server的简单例子: -module(kvs). -export([start/0, store/2, ...
Erlang基于Socket实现简单聊天室
1,chat_server.erl -module(chat_server). -export([start/1]). -define(TCP_OPTIONS, [list, {packet, 0}, {active, false}, {reuseaddr, true}]). start(Port) -> Pid = spawn(fun() -> manage_clients([]) ...
Erlang的分布式编程
1,什么是分布式程序? Erlang分布式程序是设计用来在网络计算机上运行并且只可以通过消息传递来协调活动 2,为啥要写分布式程序? 1) 性能 通过将程序的不同部分分布到不同计算机来并行运行,以此提升性能(适用于密集型、CPU是瓶颈的计算) 2) 可靠性 通过将程序分布来构建容错系统,以此提升可靠性。如果一台机器失败了,我们可以在另一台机器上继续计算 3) 伸缩性 如果我们scale up,迟早 ...
如何写超强伸缩性的多游戏玩家服务器
附标题:如何构建超强伸缩性的游戏服务器而集容错、负载均衡和无限伸缩性于一身 原文:Writing Low-Pain Massively Scalable Multiplayer Servers 介绍 本文以我的OpenPoker项目为例子,讲述了一个构建超强伸缩性的在线多游戏玩家系统。 OpenPoker是一个超强多玩家纸牌服务器,具有容错、负载均衡和无限伸缩性等特性。 源代码位于我的个人站点上 ...
Joe Armstrong:关于并行编程和Erlang的十个问题
原文:Ten Questions with Joe Armstrong about Parallel Programming and Erlang 第一部分:关于并行编程的通用问题 1) Michael:我们进入了多核时代,你认为并行计算最终会成为主流吗?或者这仅仅是一个阶段并且很快对并行编程感兴趣的人将(又一次)变成高性能社区的一员? Joe:是的,绝对主流——我们讨论的是双核时性能提高两倍而 ...
gen_server入门
gen_server入门 1)什么是gen_server? gen_server是OTP(Open Telecom Platform)的一个组件,OTP是Erlang的应用程序框架,gen_server定义了自己的一套规范,用来写Erlang服务器程序 gen_server manual: http://www.erlang.org/doc/man/gen_server.html 2)使用gen ...
OTP Design Principles Overview
1,Supervision Trees 来源于workers和supervisor模型 workers就是实际执行计算的进程 supervisors是监控workers的进程,如果workers进程崩溃,supervisors可以负责重启workers进程 supervision tree将代码分层为supervisors和workers,方便构建容错系统 2,Behaviours Behavio ...
OTP Design Principles: Gen_Server Behaviour
OTP Design Principles: Gen_Server Behaviour 1,Client-Server原则 client-server模型由一个中心服务器和任意多的客户端组成 该模型主要用来做资源管理操作,不同的客户端共享一个通用的资源,服务器负责管理该资源 2,例子 -module(ch3). -behaviour(gen_server). -export([start_li ...
OTP Design Principles: Gen_Fsm Behaviour
1,有限状态机 FSM,有限状态机,可以用以下形式来描述做一个关系集: State(S) x Event(E) -> Actions(A), State(S') 意思是,如果我们位于状态S,然后事件E发送了,则我们应该执行动作A,并且将状态改为S' 2,例子 有一个代码锁的门,如果输入的代码顺序是对的,那么将门打开30秒 如果输入代码不完全,则等待下次按钮按下,如果输入代码顺序是错的,则 ...