有人可以解释Erlang的Pid结构吗? Pids看起来像这样: <ABC> ,例如<0.30.0>,但是我想知道这三个“比特”是什么意思:A,B和C. 在本地节点上,“A”似乎总是0,但是当Pid的所有者位于另一个节点上时,该值会改变。 是否可以直接使用Pid在远程节点上发送消息? 就是这样的:<4568.30.0>! 消息,而不必明确指定注册过程的名称和节点名称({proc_name,Node}!Message)?
Erlang的特点 来自Erlang编程 (2009): Erlang的并发性是快速和可扩展的。 其进程是轻量级的,因为Erlang虚拟机不会为每个创build的进程创build一个OS线程。 它们是在虚拟机中创build,调度和处理的,与底层操作系统无关。 因此,进程创build时间是微秒级的,并且与现有进程的数量无关。 将它与Java和C#进行比较,在每个进程中创build一个底层操作系统线程:您将得到一些非常有竞争力的比较结果,Erlang的性能大大超过了这两种语言。 来自Erlang的并发导向编程(pdf) (幻灯片) (2003): 我们观察到创build一个Erlang过程所花费的时间是恒定的1μs到2500个过程; 此后,对于多达30000个过程,其增加到约3μs。 Java和C#的性能显示在图的顶部。 对于less量的stream程来说,创build一个stream程大约需要300μs。 创build两千多个进程是不可能的。 我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间大约是0.8μs。 对于C#,每个消息大约需要50μs,直到最大进程数(大约1800个进程)。 Java甚至更糟糕,对于高达100个进程,每个消息花费大约50μs,而当有大约1000个Java进程时,每个消息快速增加到10ms。 我的想法 我没有完全理解为什么Erlang进程在产生新进程方面更有效率,并且每个进程的内存占用更小。 操作系统和Erlang虚拟机都必须执行调度,上下文切换以及跟踪寄存器中的值等。 简单地说,为什么OS线程不像Erlang中的进程一样实现呢? 他们需要更多的支持吗? 为什么他们需要更大的内存空间? 为什么他们的产卵和交stream比较慢? 从技术上讲,为什么Erlang中的进程比OS线程在产卵和通信方面更有效率? 为什么操作系统中的线程不能以同样有效的方式实现和pipe理? 为什么操作系统线程有更大的内存占用,再加上较慢的产卵和通信? 更多的阅读 Erlang VM内部重点关注SMP (2008) Java和Erlang中的并发(pdf) (2004) Java和进程中的线程性能测量(Erlang ,1998)
我把Project Euler的 问题#12作为一个编程练习,比较了C,Python,Erlang和Haskell中的我的(当然不是最优的)实现。 为了获得更高的执行时间,我search了第一个有1000个以上因子的三angular形数字,而不是原始问题中所述的500。 结果如下: C: lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c lorenzo@enzo:~/erlang$ time ./euler12.bin 842161320 real 0m11.074s user 0m11.070s sys 0m0.000s python: lorenzo@enzo:~/erlang$ time ./euler12.py 842161320 real 1m16.632s user 1m16.370s sys 0m0.250s Python与PyPy: lorenzo@enzo:~/Downloads/pypy-c-jit-43780-b590cf6de419-linux64/bin$ time ./pypy /home/lorenzo/erlang/euler12.py 842161320 real 0m13.082s user 0m13.050s sys 0m0.020s 二郎: lorenzo@enzo:~/erlang$ erlc euler12.erl lorenzo@enzo:~/erlang$ time erl -s euler12 solve […]
进程和线程之间的技术区别是什么? 我感觉像'过程'这个词被过度使用,也有硬件和软件线程。 像Erlang这样的语言中的轻量级过程如何? 是否有一个明确的理由使用一个术语?