7
从技术上讲,为什么Erlang中的进程比OS线程更有效率?
Erlang的特征 来自Erlang编程(2009): Erlang并发是快速且可扩展的。它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建一个OS线程。它们是在VM中创建,计划和处理的,与基础操作系统无关。结果,进程创建时间约为微秒,并且与同时存在的进程数无关。将此与Java和C#进行比较,在Java和C#中为每个进程创建一个底层OS线程:您将获得一些非常有竞争力的比较,其中Erlang的性能大大优于两种语言。 摘自Erlang的面向并发编程(pdf) (幻灯片)(2003): 我们观察到,创建一个Erlang进程所花费的时间在2,500个进程中恒定为1µs。此后,对于多达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线程更有效?为什么不能以同样有效的方式来实现和管理操作系统中的线程?为何OS线程占用的内存更大,并且生成和通讯速度较慢? 更多阅读 专注于SMP的Erlang VM内部(2008) Java和Erlang中的并发性(pdf)(2004) Java和进程中的线程的性能度量(Erlang,1998年)