相关疑难解决方法(0)

从技术上讲,为什么Erlang中的进程比OS线程更有效?

Erlang的特点

来自Erlang Programming(2009):

Erlang并发性快速且可扩展.它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建一个OS线程.它们在VM中创建,调度和处理,与底层操作系统无关.结果,进程创建时间大约为微秒,并且与并发存在的进程的数量无关.将其与Java和C#进行比较,其中为每个进程创建底层OS线程:您将获得一些非常有竞争力的比较,Erlang大大优于两种语言.

来自Erlang的并发编程(pdf) (幻灯片)(2003):

我们观察到创建Erlang进程所需的时间是1μs到2,500个进程; 此后,对于多达30,000个过程,它增加到大约3μs.Java和C#的性能显示在图的顶部.对于少量过程,创建过程大约需要300μs.创建两千多个流程是不可能的.

我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间约为0.8μs.对于C#,每个消息大约需要50μs,直到最大进程数(大约1800个进程).Java更糟糕的是,对于多达100个进程,每个消息花了大约50μs,此后当大约有1000个Java进程时,它每个消息迅速增加到10ms.

我的想法

我并不完全理解为什么Erlang进程在产生新进程方面更有效率,并且每个进程的内存占用量更小.OS和Erlang VM都必须进行调度,上下文切换,并跟踪寄存器中的值等等......

为什么OS线程的实现方式与Erlang中的进程不同?他们还需要支持更多的东西吗?为什么他们需要更大的内存占用?为什么他们的产卵和沟通较慢?

从技术上讲,为什么在产生和通信时,Erlang中的进程比OS线程更有效?为什么操作系统中的线程不能以同样有效的方式实现和管理?为什么操作系统线程的内存占用量更大,产生和通信速度更慢?

更多阅读

erlang multithreading lightweight-processes green-threads

165
推荐指数
4
解决办法
3万
查看次数

如果有的话,Erlang进程如何映射到内核线程?

Erlang因能够支持许多轻量级进程而闻名.它可以做到这一点,因为它们不是传统意义上的进程,甚至不是P线程中的线程,而是完全在用户空间中的线程.

这很好(实际上太棒了).但是,如何在多核/多处理器环境中并行执行Erlang线程?当然它们必须以某种方式映射到内核线程才能在不同的内核上执行?

假设情况就是这样,这是怎么做到的?许多轻量级进程是否映射到单个内核线程?

或者还有另一种解决这个问题的方法吗?

parallel-processing erlang multithreading lightweight-processes

48
推荐指数
2
解决办法
5985
查看次数