它归结为线程与进程。
操作系统是专门设计的,因此每个“用户”都认为他们拥有整台计算机——这就是为什么你以用户 wwwrun的身份运行 apache。
程序员,作为程序员,开始重载这种范式,首先是每个人类用户运行多个“工作”。因为操作系统是为多个用户设计的,所以该架构的扩展上限反映了登录用户的扩展上限——这就是为什么 apache 将在 4,000 到 8,000 个用户时开始消亡的原因。
流程是一个成熟的范例(我的流程不会让你的流程崩溃)。但是,当我们开始看到线程的引入时,事情开始变得非常不同。在这里,我们的程序具有外部阻塞活动(在磁盘上等待、在 io 上等待、在内存上等待)希望能够一方面等待,另一方面工作,线程允许您这样做并克服两个问题:
线程的问题在于它们打破了进程设计的分离。我的线程可能会破坏您的线程 - 错误会传播。
Erlang 的不同之处在于许多方面。Joe Armstrong 的博士论文名为“在存在软件错误的情况下制作可靠的分布式系统”。
可靠性意味着进程优于线程。问题是操作系统进程太“昂贵”,因为它们是为人类(你拥有机器)设计的,而不是为程序的并发单元设计的。在 Erlang VM 中,VM 具有多用户系统的全部功能(它在操作系统进程中运行),每个 Erlang 进程的并发能力要小得多——如果它想使用“大机器”的话与为它做这件事的虚拟机交谈。所以 Erlang 进程比操作进程(和线程)便宜得多。你只是产卵,产卵,产卵。开箱即用的 Erlang VM 从 2**8 个进程开始,但您可以将其增加到数百万个(如果您有足够的 RAM)。
此外,正如乔在他的博士论文第一部分的第一部分所说的那样,要拥有可靠的软件,您需要从两台计算机开始。使用 Erlang/OTP,在编写时您不知道您的软件将在哪台计算机上运行。Erlang/OTP 集群在运行时会分配你的计算工作。因此,Erlang 进程是本地分布式的,spawn()(Erlang for fork())和重启语义也是如此。
因为 Erlang 有自己的进程,所以它有自己的调度程序和自己的代码加载器/二进制格式(Erlang 可以解释或编译为本地二进制文件)。这会带来一系列额外的好处——在您编写 Erlang/OTP 应用程序之前,它已经可以将其二进制文件热交换出来,等等
因此,确保您可以使用 C++ 编写多线程应用程序 - 但您有责任防止错误传播和构建系统稳定性。
当然,您可以用 C 构建可靠的软件 - 看看 Erlang(VM 是用 C 编写的),重点是您为什么要这样做?在过去,公司编写自己的“操作系统”,您现在可以编写自己的操作系统,但您为什么要这样做?有数百万行健壮的测试代码“执行”,就像 Erlang/OTP 系统中有 150 万行健壮的测试代码“执行”一样。
使用 Erlang 就是使用其他人编写的东西,并且只构建使您的公司有效的部分。