Erlang高级原理和应用精品PPT课件

合集下载

ERLANG介绍1

ERLANG介绍1

简单的代码示范



function fact(n) { int s = 1; for(int i=2;i<=n;i++) s = s * i; return s-> 1; fact(N) -> N * fact(N-1).
简洁,程序结构一目了然。
Erlang
人生苦短,快用ERLANG
我们在做什么?

WEBGAME 网页游戏 MMORPG 大型多人在线角色扮演游戏 游戏服务器端开发
语言的选择


C++ JAVA C# ERLANG Python / PHP 各种语言的简单对比。 ERLANG为我们提供了什么优势?


我们的优势是什么?

登录,多角色,换武器,换衣服 走动,切换地图 战斗,技能(特效) 聊天 组队,跟随队长
明朝MMORPG性能

测试走路机器人500人 每秒25W包广播 服务器CPU 20%,内存90M左右。 客户端30-40%的CPU, 200-300M的内存
架构


山寨 速度 持续改进 如何将我们的优势发挥到极致

什么是ERLANG



面向并发 面向消息 函数式编程 为开发电信级大规模并发应用而诞生 由瑞典爱立信开发 1987年面世 (对比,JAVA 1995年面世, C++ 80年代初,ANSI C标准 1987年)
ERLANG特性
第一次接触ERLANG



2009年9月,明朝时代FLASH版上线前夕。 AJAX聊天 转成 SOCKET聊天 Ejabberd开源聊天服务器,XMPP通用聊天协 议,RFC3920标准 使用现成的产品,加速了明朝FLASH版的上 线。 开发速度是关键。

Erlang的高级特性和应用PPT优秀

Erlang的高级特性和应用PPT优秀
Erlang的高级特性和应用
/8/19
Topic(90分钟)
a.Erlang在国内应用情况 b.Erlang是个操作系统 *nix c.Erlang分布和集群 (*) d.Erlang数据库 Mnesia (*)
1. Erlang在国内的应用案例
a.校内的广告平台 b.Sohu的白社会 c.阿里巴巴的云计算平台 d.Startup公司的webgame e.一年一度的Erlang中国社区活动
c.Erlang的代码不存在c那样潜在的bug, cover工 具能够100%覆盖过了,基本上0.9999%可靠
d.扩展容易 无需修改代码 多个cpu 效能就等于 N × 系数(0.8)
e.Jit支持,更快更强
3. Erlang 分布和集群
a.C底层支持, 效率保证 b.分布的原语是内置的 支持cnode, jnode c.进程的位置无关性 d.名称服务 e.节点间自动tick,维护节点的up, down f. Global模块提供全局空间的访问 g.Group leader提供全局的IO服务
Topic(90分钟) 为集群内置了inet常用的模块
Profile erlang e.Profile erlang f. 工具集 erlang
高性能高可靠(20年成就卓越)
a. 用erlang可以很少的代码做出一个hello world web服务器 单个cpu达到16000个并发请求。
b.同样功能的nginx服务器(顶级高手写的, F5 作者) 只能做到12000个并发请求。
在实际中的应用
a.Ejabberd和rabbitmq用作数据后端 b.Distributed application的状态保持 c.缺点:网络失败分区后可能数据不统一 d.这个问题很棘手

Erlang开发及应用

Erlang开发及应用

Erlang开发及应用litaocheng@What is Erlang_ERicsson LANGuage函数式编程语言(FP)面向并发(OC),基于消息Ericsson创建, 最初用于电信系统开发成熟, 稳定, 具有20多年历史适于电信系统, 分布式系统, 高并发服务器Open Source, 跨平台, GC______ 不适于底层系统开发History1980s Ericsson实验室思考如何轻松开发电信系统应用1987年左右, Erlang浮出水面1989年JAM虚拟机C语言实现_1996年OTP项目启动, 融合开发经验, 提供易用, 强大的Erlang开发库1998年开源2007年《Programming Erlang》出版目前版本Erlang R13B1 (5.7.2)Erlang优势多核SMP支持内建分布式支持基于轻量进程及消息的高并发模型代码热替换开发速度快, 高性能, 高稳定性FP编程,代码灵活高效, 副作用小丰富的分析及监控程序经过商业产品, 长久大规模验证OpenSource, 代码面前无秘密Erlang Hello World代码hello.erl:1 -module(hello).2 -compile([export_all]).34 main() ->5___ io:format("hello world!~n").编译:_$ erlc hello.erl运行:_$ erlEshell V5.7.1_ (abort with ^G)1> hello:main().hello world!ok__Erlang Hello World CON'T1 -module(hello).声明模块名称,其必须和文件名一致.模块是Erlang项目中代码组织的基本方式.2 -compile([export_all]).指明编译选项,export_all 用来导出所有本模块中的函数,exportedfunction是模块的接口,其他模块只能调用exported function4 main() ->为函数头(head),包含函数名称和参数, 后紧随一个'->'分割符5___ io:format("hello world!~n").为函数体(body),包含Erlang表达式,这里调用io模块的format函数在默认输出中打印"hello world!"在上面的运行结果中,最后有一个"ok",这是io:format/1的返回值,表示打印成功,Erlang中任何函数都有返回值.Erlang 语法Data Types____ 8种基本类型integer - 4,_ -4, 2#100, 16#4, 920828990801238101010..float - 3.0, 3.5e2, 6.5e-2, (IEEE754 64bit)atom - hello, your_name, root@host, 'IsAtom'binary - <>reference - make_ref(),一个随机值fun - fun() -> some_expr endport - 与外部应用进行交互的接口pid - process identifier, 用来操作process____ 2种复合类型tuple - {foo, male, 28, china, <>}_list - [{ip, any}, {port, 1234}, binary]Erlang 语法CON'TPattern Match_ _ 语言层级的模式匹配, 代码更加简洁.___ 适用于函数调用, case, receive, try表达式及"="操作___ case Value of______ N when is_integer(N) -> N;______ _ when is_list(Value) -> list_to_integer(Value)___ end_变量大写字母或"_" 开头, 只能包含数字,字母,"_", "@".如X, Name1, _Phone, _, Host@变量分为Unbound和Bound, Unbound变量只能用在模式匹配中.变量Bound后,Value就不可修改_变量只能单次赋值(并发及调试考虑)N = 3 (ok)N = 4 ( oops! not match)________Erlang 语法CON'TBinary匹配使用binary可以轻松的实现二进制协议.(1)解析IP包:-define(IP_VERSION, 4).-define(IP_MIN_HDR_LEN, 5)....DgramSize = size(Dgram),case Dgram of<> when HLen >= 5, 4*HLen =OptsLen = 4*(HLen - IP_MIN_HDR_LEN),<> = RestDgram,___Erlang 语法CON'T_(2)自定义协议假如我们定义了一个协议, 前2 bytes(16位) 标记消息体的长度, 后面为消息体, 最后为占用1个byte的结尾符0xef, 示意图如下:[--- length ---][--------- payload ------][ef]|------ 2 -------|---------- Length -------|-1-| (单位byte)则对应的binary匹配表达式如下:...Packet = ...case Packet of___ <> ->__ ____ {body, PayLoad};___ _ ->_______ {error, invalid_packet}end.___Erlang 语法CON'T序列化与反序列化Erlang中序列化非常简单term_to_binary/1 - 将任意数据转化为二进制序列binary_to_term/1 - 将编码的二进制数据转化为Erlang数据比如:Obj = {apple, {price, 2.0}, {origin, shandong}},Bin = term_to_binary(Obj),Obj = binary_to_term(Bin)CouchDB中大量使用erlang的序列化相关函数,完成数据的存储与加载. ___Erlang 语法CON'T函数_ __ 一切皆函数, 每个调用都有return, 函数可以作为基本数___ 据类型.作为返回值:op_fun('+') ->___ fun(N1, N2) -> N1 + N2 end;op_fun('-') ->____ fun(N1, N2) -> N1 - N2 end.作为参数:> FIsEven = fun(E) -> E band 2#1 =:= 0 end.> lists:filter(FIsEven, [1, 2, 3, 4, 5, 6]).> [2, 4, 6]___Erlang 语法CON'TTail Recursion尾递归Erlang中没有for, while关键字可以利用递归实现循环在server开发中,确保使用尾递归:server_loop(Args) ->___ ...some action...___ server_loop(Args).使用尾递归,可以消耗很少的内存,仅仅是一个地址跳转. server_loop(Args) ->___ ...some action...___ server_loop(Args),_ _ other_fun().Erlang 语法CON'T_发送Message "!"_ __ 基于消息通信,No Lock! No Shared Memroy!____ Pid ! {msg, "hello, I love erlang"}____ 向Pid(本地或远程主机)代表的进程发送消息receive1, 阻塞等待任意消息:receive____ Msg -> okend3,等待消息,超时为5 sec:receive_____ Msg -> okafter 5000 ->____ timeoutend2,实现sleep:receiveafter Time ->___ okend4,检测是否存在消息:receive____ SomeMsg -> existafter 0 ->_____ no_existendErlang 并发关于Process每个Process拥有一个mailbox,保存消息Processes之间通过发送异步Message进行交互,无共享状态轻量,兼有OS Process的隔离及OS Thread的高效Process具有自己Stack, Heap, GCProcess可以位于Local,也可以位于Remote MachineProcess能够进行多种形式的管理及控制(link, monitor, exit signal) Process为erlang高并发,高容错,分布式的基础并发Process数: default 32768, max 268435456Erlang 并发CON'T创建Processspawn(Fun), 比如> spawn(fun() -> io:format("i'm ~p~n", [self()]) end).i'mspawn(Mod, Fun, Args),比如> spawn(io, format, ["i'm ~p~n", [self()]])._i'mspawn_link,_ spawn_opt, spawn_monitor ...销毁Process进程内部调用exit(Reason), 比如exit(normal), 正常退出进程内部发生异常导致程序退出其他进程调用exit(PidBeTerminate, Reason) _Erlang 并发CON'T基于Process的http server 框架(one loop process, per conection per process): _setup up listen socket,spawn(listen_process).in listen_process:__ while can accept new_ client connect_ _ _ _ accept_,_ _ _ _ spawn(client_process)__ loopin client_process:_ _ process protocol,___ close socket.__ _Erlang 并发CON'T使用Erlang我们可以:以清晰的风格开发高并发的应用_我们将不在受困于:线程池的复杂死锁,竞赛的窘迫内存泄露局部问题,导致的全局崩溃与跨平台多核SMP的格格不入__Erlang 分布式Erlang Node是分布式通讯的基本单元,可以位于同一机器or 多台机器, 实现了原语级的节点通讯Erlang Node 通过erl -sname Name_ or erlang -name Name启动, 同一台机器可以启动多个Node每台机器上启动Erlang Node时,都会启动一个epmd(Erlang Port Mapper Daemon, port 4396),用来进行Node和Machine之间的映射不同机器的Node之间通过Tcp连接进行Message传输(可以自定义分布式通讯实现,如通过ssh)global维护一个全局的Nodes网络spawn[_link|_opt]都具有分布式版本,可以再其他节点创建Process Erlang 分布式CON'Trpc 模块可以在其他Node上执行操作slave, remsh, remote shell等方式启动,连接Erlang NodeErlang中进程具有位置透明性通过message及receive表达式,轻松实现同步or异步, timeout等网络通信中多种机制Erlang本身提供tcp,udp等常规的网络编程方式使用Erlang内建分布式机制,可以快速开发多种应用,也可以基于socket 开发各种专有应用Erlang 分布式CON'TErlang 分布式CON'T节点A2连接节点B2步骤Node A2, B2启动,绑定一个本机端口,并注册到本机的epmd(default port 4396)A2连接HostB epmd,请求获取B2节点的绑定端口HostB epmd将B2的bind port及dist协议版本等信息返回给A2_A2与B2协商,建立tcp连接,如果连接成功,维护一个tick,来定期检测B2节点_A2与B2节点之间的消息,通过此连接进行发送_Erlang OTPOTP(Open Telecom Platform),其定义了一系列项目开发中需要的模式及部署升级策略,为提高开发效率,构建高效,稳定系统提供了巨大的帮助. 同最初时的专有电信平台应用已没有太多关系当前系统都是采用OTP进行开发Erlang中各种lib都是基于OTP开发可以理解成某种轻量的框架,或者具体化的设计模式behaviours包含:application, supervisor, gen_server, gen_fsm, gen_event application,release,release handling提供应用的部署,升级,回退等实现Erlang OTP CON'TBehaviours通过定义一些简单的callback模块实现特定功能.application - 定义application,实现某种功能,由其他behaviours组成supervisor - 定义一个supervisor tree,实现各种策略的任务重启机制gen_server - 定义一个通用的server模型,一个process loop,提供同步异步接口gen_fsm - 实现一个状态机gen_event - 实现一个event manager及event handler模型与其它语言的交互External App外部应用崩溃不会影响Erlang虚拟机Ports - 通过port与外部应用交互(stdin/stdout)Erl_Iterface - 提供c的封装,方便开发port应用Link in Drivershared library (SO in Unix, DLL in Windows),影响Erlang虚拟机稳定性(不推荐)Port dirvers -提供c封装,运行在erlang虚拟机内部C Nodes遵照erlang的交互协议, 使用c实现的一个erlang nodeJinterface提供一系列与Erlang进行交互的Java包Erlang 代码片段求某个数的阶乘_ _ _ __________ factorial(0) -> 1;________ factorial(N) -> N * factorial(N-1).获取远程机器的issue信息(linux)______ -module(issue).__ _ _ -compile([export_all]).__ _ _ %% start server______ server() ->_ _ _ _ _ _ register(issue_server, spawn(fun server_loop/0)).____ _ server_loop() ->___________ receive_________________ {From, {get, issue}} ->_________________ From ! {issue, get_issue()};___________ _ ->_______________ ok___________ end,__________ server_loop().____Erlang 代码片段CON'tget_issue() ->___ {ok, Bin} = file:read_file("/etc/issue"),___ Bin.%% start clientclient(ServerNode) ->___ true = net_kernel:connect_node(ServerNode),___ {issue_server, ServerNode} ! {self(), {get, issue}},___ receive_______ {issue, Issue} ->___________ io:format("server issue:~s~n", [Issue])___ after 1000 ->___________ io:format("receive issue time out~n")___ end.调用:$ erl -sname server(server@litao)1> issue:server().true$ erl -sname client(client@litao)1> issue:client('server@litao').server issue:Ubuntu 9.04 \n \l____产品开发流程架构设计单台or 分布式Master-Slave or Grid _ Monitor,____ Failover, Net Comunication, Database, Replica ...OTP Behaviourhow many applicationuse supervisor, gen_server, gen_fsm, gen_eventCoding, 及单元测试用例. 每个module都经过测试(eunit)编写系统测试框架,覆盖测试,确保系统正确(common test)压力测试,分析性能瓶颈,进行优化(fprof)系统上线,监控功能(ganglia, nagios, monit)新的功能或需求,重复2-7一些工具appmon - OTP application监控工具cover -_ erlang代码覆盖测试ntop - 显示Node中进程信息(unix top)make - erlang中的make工具pman - erlang中进程管理器tv - ets 和mnesia 查看器fprof -_ erlang系统性能分析common_test - erlang测试框架dialyzer - 代码静态分析debugger - 单步调试工具,基于(tcl/tk)学习资源Erlang官方网站/docErlang China/Erlang Mailist/Erlang-Questions-f14096.html Erlang Planet/Erlang非业余研究/Erlang Display/开源项目ejabberd - the Erlang Jabber/XMPP daemon RabbitMQ - AMQP serverCouchDB - schema-free document database Tsung - multi-protocol distributed load testing Scalaris - distributed key-value storeDisco - MapReduce FrameworkMochiweb - Powerful Http Server Tookit自己动手发起erlang开源项目!案例AXD301高并发的电信交换机99.9999999% 可靠性(~3ms 故障/年)超过100万行Erlang代码软实时系统高容错案例WEB IM后台(mochiweb)_7+ 百万活跃用户~100 serverajax + comet(long-polling)更多应用。

Erlang OTP 设计原理

Erlang OTP 设计原理

欢迎阅读Erlang OTP 设计原理文档!原文:OTP Design Principles翻译: ShiningRay文档整理:@老天眷顾的孩纸有任何问题请到这里留言。

目录第一章概述 (7)1 监督树 (7)2 行为 (7)3 应用 (11)4 发布 (12)5 发布处理 (12)第二章Gen_Server行为 (13)1 客户端-服务器端原理 (13)2 例子 (13)3 启动一个Gen_Server (14)4 同步调用——Call (15)5 异步请求——Cast (15)6 停止 (16)7 在监督树中 (16)8 独立Gen_Server (17)9 处理其他消息 (17)第三章Gen_Fsm行为 (18)1 有限状态机 (18)2 例子 (18)3 启动一个Gen_Fsm (19)4 事件通知 (20)5 超时 (21)6 所有的状态事件 (21)7 停止 (22)8 在监督树中 (22)9 独立的Gen_Fsm (22)第四章Gen_Event行为 (23)1 事件处理原理 (23)2 例子 (24)3 启动一个事件管理器 (25)4 添加事件处理器 (25)5 事件通知 (26)6 删除事件处理器 (26)7 停止 (27)8 在监督树中 (27)9 独立的事件管理器 (27)第五章Supervisor行为 (28)1 监督原理 (28)2 例子 (28)3 重启策略 (28)4 最大重启频率 (29)5 子进程规格 (30)6 启动一个督程 (31)7 添加子进程 (32)8 停止子进程 (32)9 simple_one_for_one督程 (32)10 停止 (33)第六章Sys与Proc_Lib (34)1 简单调试 (34)2 特殊进程 (35)3 例子 (36)4 启动进程 (38)6 处理系统消息 (40)7 用户定义的行为 (42)第七章应用 (44)1 应用的概念 (44)2 应用回调模块 (44)3 应用资源文件 (45)4 目录结构 (46)5 应用控制器 (47)6 加载和卸载应用 (47)7 启动和停止应用 (48)8 配置应用 (48)9 应用启动类型 (50)第八章被包含的应用 (51)1 定义 (51)2 指定被包含的应用 (51)3 在启动过程中同步进程 (52)第九章分布式应用 (54)1 定义 (54)2 指定分布式应用 (54)3 启动和停止分布式应用 (55)4 故障转移 (56)5 接管 (57)第十章发布 (58)1 发布的概念 (58)2 发布资源文件 (58)3 生成启动脚本 (59)5 目录结构 (61)6 无盘与只读客户端 (62)第十一章发布处理 (64)1 发布处理原理 (64)2 要求 (65)3 分布式系统 (65)4 发布处理指令 (65)5 load_module (66)6 update (66)7 add_module 和delete_module (67)8 应用指令 (67)9 apply(低级) (68)10 restart_new_emulator(低级) (68)11 应用升级文件 (68)12 发布升级文件 (70)13 安装一个发布 (71)14更新应用规格 (74)第十二章Appup Cookbook (76)1变更功能模块 (76)2 变更驻留模块 (76)3 更改回调模块 (76)4 变更内部状态 (77)5 模块依赖性 (78)6变更特殊进程的代码 (79)7 变更督程 (80)8 变更属性 (80)9 变更子进程规格 (81)11 添加或删除模块 (82)12 启动或终止进程 (82)13 添加或移除应用 (82)14 重启应用 (83)15 变更应用规格 (83)16 变更应用配置 (83)17 变更被包含的应用 (83)18 应用重启 (84)19 督程变更 (85)20 变更非Erlang代码 (86)21 模拟器重启 (87)第一章概述本OTP设计原则是针对如何根据进程、模块和目录组织Erlang代码的一系列原则。

LFE Lisp Flavoured Erlang编程课件

LFE Lisp Flavoured Erlang编程课件

LFE Lisp Flavoured Erlang编程课件LFE Lisp Flavoured Erlang(简称LFE)是一种基于Erlang编程语言的方言,它结合了Lisp编程风格和Erlang的并发能力。

LFE提供了一种表达力强大且易于扩展的编程语言,为开发人员提供了更多的选择和灵活性。

本文将介绍LFE的特点和使用方法,帮助读者了解并入门LFE编程。

一、LFE的特点LFE的主要特点有以下几点:1. Lisp风格的表达力:LFE采用了Lisp的前缀表达式语法,提供了强大的宏系统和模式匹配功能。

这种风格的语法使得编程变得更加灵活和可扩展。

2. 完全兼容Erlang:LFE是建立在Erlang虚拟机上的,完全兼容Erlang语法和模块系统。

这意味着LFE可以使用Erlang的标准库和第三方库,并能够利用Erlang的并发和容错能力。

3. 可读性强:LFE的代码由简单的表达式组成,减少了代码的复杂性。

同时,LFE还提供了对Erlang原生类型的直接支持,使得代码更易于理解和维护。

二、LFE的使用方法1. 环境搭建:要使用LFE进行编程,首先需要在本地环境中搭建LFE的开发环境。

可以通过在Erlang虚拟机上安装LFE包来实现。

安装完成后,就可以在终端中运行lfe命令,进入LFE的交互式环境。

2. 基本语法:LFE的基本语法和普通的Lisp类似,采用前缀表达式来表示代码。

可以使用defun关键字定义函数,使用let关键字来定义变量。

3. 模式匹配:LFE中的模式匹配是一种功能强大的特性,可以用于解构复杂的数据结构,并根据模式进行分支。

通过模式匹配,可以编写出简洁和易于理解的代码。

4. 宏系统:LFE提供了宏系统,可以用来进行语法扩展和代码生成。

通过宏,可以将重复的代码抽象为可复用的模板,提高代码的可读性和扩展性。

5. 与Erlang的互操作:由于LFE是建立在Erlang语言之上的,因此可以与Erlang进行无缝的互操作。

erlang内存机制

erlang内存机制

erlang内存机制Erlang是一种函数式编程语言,主要用于编写可伸缩性和高可用性的并发系统。

在Erlang中,内存管理是一项重要的任务,由运行时系统(ERTS)负责管理和优化内存使用。

1. 垃圾回收机制(Garbage Collection):Erlang采用了自动垃圾回收机制,使用了基于停止-复制(stop-and-copy)的垃圾回收算法。

该算法将所有活动的对象复制到一个新的内存空间中,并将旧的内存空间视为垃圾。

垃圾回收器定期运行,检查可用的内存空间,并回收旧的对象。

这种方式可以避免内存碎片化,并提高内存使用效率。

2. 堆(Heap):Erlang被设计成支持动态内存分配,所有的Erlang进程都有自己的堆。

堆是一个以字节为单位的连续的内存区域,用于存储进程运行时产生的动态数据,如变量、函数调用栈、元数据等。

堆的大小可以动态调整,根据需要进行自动扩展或收缩。

堆中的对象是通过垃圾回收器进行管理和回收的。

3. 栈(Stack):除了堆之外,Erlang进程还有一个栈,用于存储函数调用和局部变量。

栈是一个后进先出(LIFO)的数据结构,用于保存每个函数调用的局部数据。

栈的大小限制了函数调用的深度,当达到限制时,会引发栈溢出异常。

4. 二进制内存管理(Binary Memory Management):Erlang提供了对二进制数据的高效处理能力。

二进制数据可以直接在内存中共享,而不需要复制。

Erlang使用引用计数(reference counting)的方式跟踪二进制数据的引用情况。

当引用计数为零时,垃圾回收器可以立即回收这部分内存空间。

5. 内存调优策略:Erlang提供了一些内存调优策略,帮助开发者更好地管理内存资源。

其中包括:- 通过设置递归限制来避免无限递归调用,避免因函数调用过深而导致栈溢出异常。

- 使用bin_opt_info选项来跟踪二进制数据的引用情况,确保及时回收不再使用的二进制数据。

Erlang第一课----基本变量

Erlang第一课----基本变量

Erlang第⼀课----基本变量1、(in Erlang shell)A sequence of expressions must be terminated with a period followed by whitespace; otherwise, it won't be executed. You can separate expressions with commas, but only the result of the last one will be shown.2、Erlang shell中调试程序时,如果job僵掉了,可以⽤ctrl+G-> i -> c中断僵掉的job并连接到第⼀个job(这⾥不确定是第⼀个还是最后⼀个,待进⼀步确认)。

ctrl+G进⼊任务管理器后,h是打印帮助菜单。

3、变量名第⼀个字母必须是⼤写;或者以下⾯线(_)开始,但是⼀般⽤来标⽰这个变量只是写来看的,我们后⾯不会再⽤,即don't care one。

4、变量不能进⾏第⼆次赋值,除⾮是赋同⼀个值。

更准确来说,并不能说这是赋值,应该叫bound,即绑定;所以,我们完全可以把这⾥的Variable当做是别名,⽽且是被element唯⼀拥有的。

ps:在shell中,如果你给某个变量赋错了值,你可以使⽤f(Variable).来对其进⾏擦除;使⽤f().,即不带参数时,表⽰擦除所有变量。

另外,该flush函数只有在shell中有。

ps: 还有这些也是常⽤的:1)h(). ⽤来打印最近的20条历史命令。

2)b(). 查看所有绑定的变量。

3) e(n). 执⾏第n条历史命令。

4) e(-1). 执⾏上⼀条shell命令5、变量命名不能以⼩写开始的原因是,还有另外⼀种类型的数据叫atom。

每个atom关联了⼀个atom table,atom table在32为系统中占⽤4bytes内存,在64位系统中占⽤8个bytes内存;如果不是内存被⽤光或者是atoms的数量达到1048577,这些内存是不会被回收的,直到程序结束。

erlang 并发 原理

erlang 并发 原理

Erlang 是一种功能强大的编程语言,它具有出色的并发性和分布式特性。

Erlang 的并发原理基于其独特的 Actor 模型,该模型将每个并发单位视为一个轻量级的进程,可以独立运行、接收消息以及发送消息给其他进程。

这种基于消息传递的并发模型使得开发者可以编写出高度可靠、可扩展的并发程序。

在 Erlang 中,每个进程都是一个独立的执行实体,它们之间通过消息传递进行通信。

进程间的通信是通过发送和接收消息来实现的。

这种基于消息传递的并发模型与传统的共享内存模型相比,具有更高的可靠性和可扩展性。

Erlang 的进程非常轻量级,可以创建数以百万计的进程,而且创建和销毁进程的开销非常低。

每个进程都有独立的内存空间和状态,它们之间通过消息传递进行通信。

这种设计方式使得 Erlang 程序可以轻松地处理大量并发任务,并且可以很好地应对高并发场景下的性能和可靠性挑战。

Erlang 的另一个重要特性是分布式。

Erlang 进程可以在不同的节点上运行,这使得Erlang 程序可以轻松地实现分布式计算和分布式通信。

Erlang 的分布式特性使得开发者可以编写出高性能、高可用的分布式应用程序。

总之,Erlang 的并发原理基于独特的 Actor 模型和轻量级进程,这使得 Erlang 程序可以轻松地实现高度可靠、可扩展的并发计算和分布式计算。

同时,Erlang 还提供了丰富的库和工具,使得开发者可以更加方便地编写出高质量的并发程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分布之otp支持
gen_server 屏蔽位置相关 rpc distribute application
Failover Takeover
进程的迁移 分布数据库mnesia trace seq_token
节点间通讯
紧凑的协议 可替换的通讯通道 节点名字 epmd 相当于DNS 消息透明 安全措施 cookie
Erlang的系统组成
编译器 erlang 库 erlang VM + 基本库 c 调试器 erlang Pro 工具集 erlang
高性能高可靠(20年成就卓越)
用erlang可以很少的代码做出一个hello world web服务器 单个cpu达到16000个并发请求。
同样功能的nginx服务器(顶级高手写的, F5作者) 只能做到12000个并发请求。
Erlang呢?
Erlang系统类比
函数 (fun () -> ok end) 模块(module xxx. xxx.erl) Beam文件(编译器,opcode) Application (beam+数据文件) VM bootstrap, erlang进程 (抢占调度 ) 消息,Port, IPC通讯 etop
Erlang的高级特性和应用
2009/8/19
Topic(90分钟)
Erlang在国内应用情况 Erlang是个操作系统 *nix Erlang分布和集群 (*) Erlang数据库 Mnesia (*)
1. Erlang在国内的应用案例
校内的广告平台 Sohu的白社会 阿里巴巴的云计算平台 Startup公司的webgame 一年一度的Erlang中国社区活动
多谢大家
Q&A时间
Erlang的代码不存在c那样潜在的bug, cover 工具能够100%覆盖过了,基本上0.9999%可 靠
扩展容易 无需修改代码 多个cpu 效能就等于 N × 系数(0.8)
Jit支持,更快更强
3. Erlang 分布和集群
C底层支持, 效率保证 分布的原语是内置的 支持cnode, jnode 进程的位置无关性 名称服务 节点间自动tick,维护节点的up, down Global模块提供全局空间的访问 Group leader提供全局的IO服务
节点交互和容错
支持节点间的link, monitor, exit 节点up down自动觉醒 节点加入自动化 同步信息 节点支持分区 避免flood
为集群内置了inet常用的模块
http/ ssh ssl tcp/udp/sctp asn.1 corba snmp
看图不说话 (消息的跟踪)
Erlang在国外的成功项目
Ejabberd Rabbitmq Couchdb Mochiweb Disco …
2.Erlang和操作系统比较
Unix操作系统 用c++做例子
函数 (void f() {}) 类 (class xxx{};) 模块(xxx.cpp) 可执行文件(编译器,机器指令) 应用程序包括数据文件 OS启动,系统进程(抢占式调度 ) IPC通讯 监控工具(Top)
3. Mnesia分布数据库
传统数据库
不保证实时 IPC通讯 数据列集 Master/slave 模式 数据水平切割麻烦
Mnesia的特点
适合读多写少的情况 软实时 大部分都都在本地内存(本地进程的
cpu时间) 同一进程 无需列集 无需IPC通讯 支持水平分割 支持数据冗余 节点间对等 查询和写入可以在任何节点发起 数据自动迁移
数据操作
数据备份/恢复 和传统数据库的互动(unixodbc) 节点加入退出 数据分片 无限量的加大数据量 程序员
透明
பைடு நூலகம்
在实际中的应用
Ejabberd和rabbitmq用作数据后端 Distributed application的状态保持 缺点:网络失败分区后可能数据不统一 这个问题很棘手
相关文档
最新文档