1.Erlang/OTP平台

?理解并发和Erlang的进程模型

?Erlang的容错与分布式支持

?Erlang运行时系统的重要属性

?什么是函数式编程,如何用Erlang进行函数式编程

1.并发:只有同时发生的任务才能算是并发任务,并发不完全是并行

  在Erlang中,并发的基本单位是进程。进程拥有自己的工作内存空间和自己的信箱,信箱用于存放外来消息;而许多其他语言和操作系统中的线程却是共享相同内存空间的并发活动(随之而来的是层出不穷的互踩脚趾的机会)。因此与线程相比,Erlang进程更加安全。故可以说进程封装了状态。

2.4种进程通信范式:持锁共享内存,软件事务性内存,future和消息传递

  消息传递:同步方式和异步方式

  同步方式下,消息抵达接收端之前发送方什么事也做不了

  异步方式下,消息一经投递发送方便可立即着手于其他事物

3. ①创建进程:派生

  Erlang进程不是操作系统线程。它们由Erlang运行时系统实现,比线程要轻量得多。运行时系统中所有进程之间相互隔离;单个进程的内存不与其他进程共享,也不会被其他濒死或跑疯的进程破坏。

  spawn(io, format, ["erlang"]).

  ②进程之间怎么打交道

    用于消息发送的基本运算符 !,读作“bang”,用法是“目的地!消息”。

  Erlang进程间通信:

    

    -module(ptopcommunication).

    -export([run/0]).  

    run() ->  Pid = spawn(fun ping/0),

       Pid ! self(),

       io:format("self is ===~w", [self()]),

       receive   pong ->    io:format("run receive pong"),    

      ok  

    end.

    ping() ->  

      receive   From ->  

        io:format("===ping receive ~w", [From]),    

        From ! pong  

    end.

  备注:函数self()返回当前进程的标识符,用于告知新进程该把小消息回复给谁。每调用spawn一次都会得到一个新的进程标识符,用于唯一标识新创建的子进程。这个标识符后续可以用于向子进程发送消息。每个进程都有一个信箱,无论进程繁忙与否。都会先把外来消息存放在这,直到进程下次检查信箱前所有消息都寄存在此。随后进程会在自己乐意的时候用receive表达式从信箱中分检和读取消息。

  ③进程的终止

    进程完工后,便会消失。它的工作内存、信箱和其他资源都会被回收。该进程若是用作其他进程的数据源,那么它必须在终止前显示地将数据以消息的形式投递出去。

    崩溃(异常)造成进程意外提前终止,一旦发生崩溃,其他进程会得到通知。进程之间相互独立,单个进程的崩溃不会破坏其他进程,因为它们互不共享内部状态。这构成了Erlang另一主要特性的一个支柱:容错。

4.容错架构

  

    ①.Erlang进程意外退出时,会产生一个退出信号。所有与它连接的进程都会受到这个信号。

    ②.监督与退出信号的捕捉

      OTP实现容错的主要途径之一就是改写退出信号默认(一个进程退出,与之协作的其他进程也一并退出)的传播行为。通过设置trap_exit进程标记,便可以令进程不在服从外来的退出信号,而是将之捕捉。这种情况下,进程接收到信号后会先将其转为一条格式为{'EXIT', Pid, Reason}的消息。这条消息会像普通消息一样被丢人信箱。捕捉到信号的进程就能分检并处理这类消息。这类会捕捉信号的进程有时被称为系统进程。

4.分布式Erlnag

  Erlang规避了数据共享并通过复制进行通信,使得Erlang代码可以直接分布到多台机器上。

5.Erlang运行时系统和虚拟机

  标准Erlang实现的核心是一个称作Erlang运行时系统(ERTS)的应用:这是一大块用C语言写成的代码,负责Erlang中所有底层的玩意儿。实现Erlang进程的也是它。Erlang中所有需要底层支持的东西都是由ERTS处理。

  ERTS中特别重要的一个部分就是Erlang虚拟机模拟器:这是执行Erlang程序经编译后产出的字节码的地方,这个虚拟机也就是Bogdan Erlang抽象机(BEAM), 它非常高效。通常说的Erlang VM 指的就是模拟器加上运行时系统。

  促成Erlang的强大和高效的3个重要方面:

    调度器:处理运行中Erlang进程,令所有就绪的进程共享可用的CPU资源,并在新消息到达或发生超时的时候唤醒相应的睡眠中的进程

    I/O模型:防止系统在进程与外部设备通信时阻塞,令系统平稳运行

    垃圾回收器:回收不再使用的内存

6.函数式编程:Erlang的处世之道

  函数式编程绝对算不上Erlang的决定性特征,并发才是,但它任然是该语言的一个重要方面。

  函数式编程主要思想就是将函数看作和整数、字符串一样的数据;运用函数调用而非while或for这样的循环结构来表达算法;以及不修改变量和值。

总结:Erlang/OTP 用进程和消息传递进行并发编程、通过链接来容错,分布式编程、Erlang运行时系统和虚拟机,还有Erlang核心的函数式语言。这一切共同构成了一个稳固、高效、灵活的平台,得以构筑可靠、低延迟、高度可用的系统。

posted @ 2017-06-26 18:31  tianxincode  阅读(1157)  评论(0编辑  收藏  举报