使用基于进程的并发模型比使用基于线程的并发模型的主要优点是什么,后者适用于什么上下文?
发布于 2010-11-30 23:48:05
容错和可伸缩性是使用进程而不是线程的主要优势。
当你想在多台机器上运行系统时,依赖于共享内存或其他一些只有在使用线程时才能使用的技术的系统是无用的。迟早你需要在不同的进程之间进行通信。
例如,在使用进程时,您必须处理通过消息进行的通信,这就是Erlang处理通信的方式。数据不是共享的,因此没有数据损坏的风险。
进程的另一个优点是它们可能会崩溃,并且您可以相对安全地认为您可以直接重新启动它们(即使是跨网络主机)。但是,如果线程崩溃,它可能会使整个进程崩溃,这可能会使整个应用程序崩溃。举例说明:如果Erlang进程崩溃,您将只丢失电话呼叫或the请求等,而不是整个应用程序。
说到这里,OS进程也有许多缺点,这些缺点会使它们更难使用,例如,它永远需要产生一个新的进程。然而,Erlang有它自己的进程概念,它是非常轻量级的。
话虽如此,这个讨论确实是一个研究课题。如果你想深入了解更多细节,你可以阅读Joe Armstrong的关于容错系统的论文]1,它解释了很多关于Erlang和驱动它的哲学。
发布于 2010-11-30 23:35:04
使用基于流程的模型的缺点是速度较慢。您必须在程序的并发部分之间复制数据。
使用基于线程的模型的缺点是您可能会弄错。这听起来可能很刻薄,但它是真的--向我展示基于线程的代码,我就会向您展示一个bug。我发现线程代码中的bug已经“正确”运行了10年。
使用基于流程的模型的优点有很多。这种分离迫使您从协议和正式通信模式的角度进行思考,这意味着您更有可能得到正确的结果。相互通信的进程更容易在多台机器上向外扩展。多个并发进程允许一个进程崩溃,而不一定会导致其他进程崩溃。
使用基于线程的模型的优点是它速度快。
我更喜欢这两个中的哪一个可能是显而易见的,但以防不是:进程,一周中的每一天和周日的两次。线程太难了:我从来没有遇到过能写出正确的多线程代码的人;那些声称能写出正确多线程代码的人通常对空间还不够了解。
发布于 2010-11-30 23:56:48
在这种情况下,进程更加独立,而线程则共享一些资源,例如内存。但在一般情况下,线程比进程更轻量级。
Erlang进程与OS进程不是一回事。Erlang进程非常轻量级,并且Erlang可以在同一个OS线程中拥有多个Erlang进程。请参阅Technically why is processes in Erlang more efficient than OS threads?
https://stackoverflow.com/questions/4315292
复制相似问题