前言

最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析。

其实,还是希望越来越多的人关注Erlang,使用Erlang,壮大Erlang编程语言的社区。

说实话,我也没这么高尚,就是看到很多人对Erlang编程语言的误解,Erlang编程语言社区的凋零,招个Erlang开发难之又难,才萌生此念。

这次主要介绍Erlang编程语言。包括Erlang的简要历史以及应用场景,Erlang并发编程,Erlang编程语言的特点,环境安装就一笔带过一下好了,最后,打算演示一个Wordcount的示例,一起来瞧瞧Erlang并发进程、分布式究竟长啥样。

Erlang简要历史以及应用场景

Erlang是咋来的?语法诡异,函数式,样子“丑”到很多人不喜欢用,但是为什么很多人又“吹嘘”Erlang(我就属于“吹嘘”那一票人)?

简要历史

Erlang出现在20世纪80年代中期,由瑞典电信设备制造商爱立信所管辖的实验室开发的。当时那一票大神级人物为了寻找适合下一代电信产品的编程语言,爱立信实验室花费了两年多的时间使用原型法测试了所有可能的编程语言,最终这些人发现,虽然当时现有的编程语言也有一些有趣和相关的特性,但是并没有一门独立的语言能包容电信行业所需要的所有特性。这一点让他们非常不爽。

那好吧,他们就决定开发一种全新的编程语言。

到了1996年,Erlang编程框架OTP诞生了,OTP给Erlang编程语言系统带来了结构化的框架和一套实现健壮性和容错性的工具和类库。然后时间到了1998年12月,爱立信决定将Erlang作为开源代码发布。1991年1月份的时候,Erlang编程语言官方网站总共大约只有36k个网页,10年后,达到了2800k。看起来,Erlang社区是在不断壮大(但是这发展速度,哎... 还是太忧桑)。

应用场景

虽然很多编程语言在开发之前并没有找到自己的定位,但是Erlang编程语言的定位非常明确,就是用来构建分布式容错大规模并发软实时系统。所以Erlang不仅被使用在电信行业,在多种领域内也取得了巨大的发展和使用。

  • IM/推送  :WhatsApp、Weibo私信
  • 广告数据:OpenX、AOL ad、Ptengine
  • 基础设施:Riak、Ejabberd、RabbitMQ、RDS
  • 金融支付:融易通、电银
  • 游戏:4399、明朝

如IM/推送领域,广告数据领域,基础设施,金融支付,还有游戏。

被Facebook花了190亿刀收购的whatsapp主要用的就是Erlang,ejabberd、rabbitmq在Erlang圈也是非常出名的框架级别应用。

国内做IM/推送的公司就有点多了,北京圈,weibo私信、环信、国美,深圳的云巴,据不完全统计,我知道的就有10家左右。广告数据领域,国外有OpenX,AOL Ad,国内有ptengine(我东家,嗯,来做个广告,ptengine.com),adsage。Erlang的分布式特性使构建大规模的分布式系统变成非常方便。在基础设施中,Riak作为非常出名的NOSQL,主要就是用Erlang来开发的,国内的Erlang大神余锋也是用Erlang来开发RDS。在国内的金融支付领域,融易通和上海电银,几乎是Erlang在国内发展的倡导者,为国内培养了一大票Erlang程序员。

瞧瞧,瞧瞧,Erlang凭借其出色的并发性、分布式容错性软实时等特点,得到了很多应用领域的青睐和大规模使用。

Erlang并发编程

先大致说一下并发和并行的基本概念和简要区别。

现在很多人言必称“并发”,反正,在整理这篇blog之前我对并发和并行的区别是有点模糊的。

并发和并行

在日常生活中,并发和并行几乎表示的是同一个意思,但是在编程语言中,就精确区分一下吧。

并发的概念是什么?

在计算机操作系统中,并发指的是在一个时间间隔内有几个程序都处于已经启动运行到结束运行之间,且这几个程序都是在同一个处理机上被运行的,但是任意一个时刻点上只有一个程序在处理机上被运行。并发有三个特征:

  • 几个程序在一个时间间隔内都在被运行
  • 几个程序是在同一个处理机上被运行
  • 同一时刻点只有一个程序会被运行

并行是什么?

在汉语的理解中,并行是指并排行走或者是同时实行或实施,在操作系统中,并行指的是一组程序按照独立异步的方式执行,不等于时间上的重叠。当操作系统有两个或两个以上的CPU时,其中一个CPU执行一个线程(或进程)操作,另一个CPU可以执行另一个线程(或进程)操作,两个线程(或进程)互不抢占CPU资源,可以同时进行,这种方式就被称为并行。并行常见于高性能计算,像龙芯什么的超算、流体力学高性能计算什么的。

区别?

并发和并行,即是相似但又有区别的两个概念,并行指的是两个或多个事件在同一个时刻点发生;而并发指的是两个或多个事件在同一个时间间隔内发生。如果只有一台单核计算机,是无法在计算机上执行并行程序的,因为计算机只有一个CPU,而每次只能做一件事。然而,可以在单核计算机上执行并发程序,计算机可以在不同的任务之间分享计算机CPU事件。

并发的好处?

并发能够给我们带来很多好处,可以提升我们系统的性能,创建可扩展和容错的系统。

首先带来的好处是提升系统的性能,设想有两个任务,任务A需要10秒的执行时间,任务B需要15秒得执行时间,如果只是在单个CPU上执行任务A和任务B,需要的时间就有25秒。但是如果是在有两个CPU的计算机上,任务A和任务B的需要得执行时间就只有15秒。如果要实现这样的性能提升,就需要并发程序。现在已经是多核计算机的时代,平时用的个人电脑都是多核,而8核CPU已经成为服务器的基本标配,32核心、64核心的计算机也已经不是什么稀罕的配置。而并发程序能够更好的利用多核CPU,最大限度的提升系统的性能。

第二是可扩展性,并发程序一般由多个小型独立的进程组成,所以,增加进程数量和添加更多的计算机CPU就能够轻松的扩展系统。

第三,能够使系统更加清晰。在现实世界,很多事物都是并发的,但是大多数编程语言中的事物都是顺序发生的。现实世界得并行和编程语言中的顺序性之间的不同,就带来了诸多麻烦。在Erlang编程语言中,可以直观地将现实世界的并行性映射到Erlang的并发性上,也就能够让程序代码甚至是架构变得清晰并且易于理解。

在Erlang编程语言中,Erlang进程是并发并且独立执行的。首先在Erlang编程语言中,Erlang进程是有别于操作系统进程的。Erlang的进程是非常轻量的,它有自己的堆栈空间。并且Erlang进程之间是相互独立的,也就是说,每一个Erlang进程都有单独属于自己得堆栈空间,并且完全是私有的,两个Erlang进程之间的堆栈空间不会被共享。如果两个Erlang进程需要进行通信,那么就只能使用发送消息的方式。所以,在Erlang进程的堆空间上就需要有一块区域作为Erlang进程通信的消息邮箱。

上图是Erlang进程堆栈结构的示意图,从图中,我们可以看出,Erlang系统中的每一个进程,都有自己单独的PCB结构,栈空间,已经堆空间。因为Erlang进程轻量的特性,在系统中,就可以维护非常多的Erlang进程,这也是和操作系统进程最大的一个区别。数量众多的Erlang进程,在Erlang虚拟机的调度下,能够尽可能的利用多核计算机,进而为系统提供并发性。

最后一点需要注意是,Erlang编程语言的并发性,是由Erlang虚拟机提供的,不是操作系统,同样也不是外部库。Erlang编程语言是运行在虚拟机上的,所以它的并发性在所有得操作系统上都有相同的工作方式。

总结

Erlang在国内外使用非常广泛,国内很多团队都属于自己用着爽,国外相对比较“激进”。

参考:

1、Characterizing the scalability of Erlang VM

2、Erlang的几本书

下一篇会重点解释Erlang编程语言的特点,并发进程、分布式,别激动,很快。然后就会发现,为啥Erlang这么屌了。

Erlang基础 -- 介绍 -- 历史及Erlang并发的更多相关文章

  1. Erlang基础 -- 介绍 -- Wordcount示例演示

    在前两个blog中,已经说了Erlang的历史.应用场景.特点,这次主要演示一个Wordcount的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数. 今天和群友们讨论了一个问 ...

  2. Erlang基础 -- 介绍 -- Erlang特点

    前言 Erlang是具有多重范型的编程语言,具有很多特点,主要的特点有以下几个: 函数式 并发性 分布式 健壮性 软实时 热更新 递增式代码加载 动态类型 解释型 函数式 Erlang是函数式编程语言 ...

  3. Erlang基础知识集锦

    http://wenku.baidu.com/link?url=or-8mkUYUM0uVeqCYESGe93YIlh2IDLP7lFOwRlwr8Syf3PeHbwJC5DPCErs4NFrb1p4 ...

  4. Erlang语言介绍

    Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...

  5. [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...

  6. Web服务基础介绍

    Web服务基础介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正常情况下的单次web服务访问流程 博主推荐阅读: https://www.cnblogs.com/yinzh ...

  7. Jmeter使用实践- 基础介绍

    Jmeter使用实践- 基础介绍 随着市场上推出越来越多的测试工具,大家使用起来也比较盲目,就我个人而言,使用过LoadRunner和Jmeter 很多人倾向于LoadRunner,因为LR的功能更强 ...

  8. [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2

    声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...

  9. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

随机推荐

  1. windchill系统——eclipse与服务器同步数据操作

    步骤如下

  2. G1垃圾回收器参数配置

    下面是完整的 G1 的 GC 开关参数列表. 选项/默认值 说明 -XX:+UseG1GC 使用 G1 (Garbage First) 垃圾收集器 -XX:MaxGCPauseMillis=n 设置最 ...

  3. Text Justification,文本对齐

    问题描述:把一个集合的单词按照每行L个字符放,每行要两端对齐,如果空格不能均匀分布在所有间隔中,那么左边的空格要多于右边的空格,最后一行靠左对齐. words: ["This", ...

  4. NumPy数学算数函数

    NumPy - 算数函数 很容易理解的是,NumPy 包含大量的各种数学运算功能. NumPy 提供标准的三角函数,算术运算的函数,复数处理函数等. 三角函数 NumPy 拥有标准的三角函数,它为弧度 ...

  5. Amazon SES介绍 - SES发送邮件的过程

     Amazon SES,  全称Amazon Simple Email Service,即Amazon简单邮件服务,它是Amazon提供的一款供开发人员或公司企业用来处理邮件相关业务的服务,也就是说, ...

  6. 阿里云 centOS7.4新装nginx 不能访问

    反复装了几遍ngxin,什么防火墙,nginx.conf改了好几次都不能访问外网的ip, 原因是阿里云这货新的服务器根本就没开通443,80端口,真是坑人啊 点击配置规则,增加端口就行了 添加安全规则 ...

  7. Python之paramiko

    一.基础 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X ...

  8. 在VMware永久修改网

    如果想要永久性设置固定的IP地址,需要通过编辑网卡配置文件实现: 现在使用VI编辑器打开配置文件. # vi /etc/sysconfig/network-scripts/ifcfg-eth0 虽然直 ...

  9. 几种常见排序算法的C++描述

    基本的排序算法有如下特点: 1.几种容易的算法都是以O(N2)排序的 2.Shell排序编程简单,其也是以O(N2)排序的,在实践中用的很多 3.复杂的排序算法往往都是按照O(NlogN)尽心排序的 ...

  10. IOS对存放对象的数组排序

    我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天程序则又一个 Friend类,点菜程序会有一个Recipe类等.有时候我们希望 ...