介绍说erlang并发高效,进程切换快,具体原因是什么?
Erlang 中的进程是它自己实现的用户级进程,不是指操作系统级的进程/线程。
erlang是一个操作系统,而不只是语言。这一点非常重要。golang也是如此。
erlang自己重新定义了调度单元(erlang进程),实现了调度器。调度开销非常小。 而像java python这类语言,你创建的线程就是OS的线程,是靠OS调度,而不是虚拟机自己调度。
erlang是一种新的编程范式,新的思维方式。(相对C++ Java Python这些语言而言)
erlang没有全局变量、而且变量不可变、进程间靠消息通信…… 这些语言上的限制和要求,使得你在设计系统的时候只能采用erlang的思维方式,否则写不出代码,没法实现。最终得到的就是天然避免或减少了数据共享的并发性很高的系统。
——共享就会有竞争,竞争就需要锁,锁就是多核时代,并发编程的最大敌人,没了锁就能飞起来。
erlang的最初的电信服务需求注定了 erlang必须要满足 高并发, 分布式, 容错等要求, 所以甚至一开始的process都不是以actor模型建立的,而是以实际业务需要创建的(当时在爱立信有另外一个语言参考),在erlang,基本无法写出高效的顺序的,命令式的程序,因为它本质上不支持这么做, 试想在任何一个oop语言里,只用一个object来完成所有工作是多么荒唐.
erlang: the movie里joe说到,同样功能的erlang代码是c的10/1, 而业界都认为代码越少,bug越少,eralng的虚拟机优化了几十年了.
erlang的思想已经达了很高的境界,基于recurison的代码通常很简短而且不容易出错.
erlang是从系统底层开始构建他的并发机制的,erlang中的进程其实是linux中kernel space中userspace级别的线程,包括调度基本都是在kernel级别完成的,所以调度起来很高效。erlang并发高效其实相对于应用场景来说的,erlang本身最适合应用于通信方面的应用,本身计算和执行能力还是有限的。
平台。Linux 平台切换进程的速度很快,而在 Windows 平台就很慢了,所以 Windows 鼓励使用线程,Linux 鼓励使用进程。@依云 而 Erlang 是自己实现的进程,不局限于任何平台,切换起来是飞快的。
思想。一句话「要么好好跑,要么死翘翘」。说白了就是,相仿设法的挽救一个进程,不如放弃一个进程,再开另一个。
使用者。erlang 小众,使用它的都是工程师,所以代码效率高。任何语言刚开发出来,都在学院使用,然后是工程师,等到他普及以后,各种问题就随之而来,比如 java。