使用基于进程的并发模型的主要优点是什么? 基于线程以及后者适用于什么情境?
答案 0 :(得分:18)
容错和可伸缩性是使用Processes vs. Threads的主要优势。
如果要在多台计算机上运行系统,依赖共享内存或仅在使用线程时可用的其他技术的系统将毫无用处。迟早你需要在不同的过程之间进行沟通。
使用进程时,您必须通过消息处理通信,例如,这是Erlang处理通信的方式。数据不共享,因此不存在数据损坏的风险。
流程的另一个优点是它们可能崩溃,您可以感觉相对安全,因为您可以重新启动它们(甚至跨网络主机)。但是,如果线程崩溃,则可能会导致整个进程崩溃,从而导致整个应用程序崩溃。举例说明:如果Erlang进程崩溃,您将只会丢失该电话或webrequest等,而不是整个应用程序。
说到这一切,操作系统进程也有许多缺点,可能会使它们更难使用,比如生成新进程需要永远的事实。但是,Erlang拥有自己的流程概念,它非常轻量级。
话虽如此,这次讨论确实是一个研究课题。如果你想了解更多细节,可以给Joe Armstrong关于容错系统的文章1阅读,它解释了很多关于Erlang和驱动它的哲学。
答案 1 :(得分:7)
使用基于流程的模型的缺点是速度会慢一些。您必须在程序的并发部分之间复制数据。
使用基于线程的模型的缺点是你可能会弄错。这可能听起来很有意思,但这是真的 - 给我看基于线程的代码,我会告诉你一个bug。我发现线程代码中的错误已经“正常”运行了10年。
使用基于流程的模型的优势很多。分离迫使你在协议和正式的沟通模式方面进行思考,这意味着你更有可能做到正确。彼此通信的进程更容易跨多台计算机扩展。多个并发进程允许一个进程崩溃而不必使其他进程崩溃。
使用基于线程的模型的优点是速度快。
可能很明显我喜欢哪两个,但如果不是:进程,一周中的每一天和周日两次。线程太难了:我从来没有遇到任何可以编写正确的多线程代码的人;那些声称通常对空间知之甚少的人。
答案 2 :(得分:2)
在这种情况下,进程更加独立于彼此,而线程共享一些资源,例如记忆。但在一般情况下,线程比进程更轻量级。
Erlang Processes与OS Processes不同。 Erlang进程非常轻量级,Erlang可以在同一个OS Thread中有许多Erlang进程。见Technically why is processes in Erlang more efficient than OS threads?
答案 3 :(得分:2)
首先,流程与线程的不同主要在于处理内存的方式:
Process = n*Thread + memory region (n>=1)
进程有自己独立的内存。 进程可以有多个线程。
进程在操作系统级别上彼此隔离。 线程在此过程中与其对等方共享内存。 (这通常是不可取的。有一些库和方法可以解决这个问题,但这通常是操作系统线程上的一个人工层。)
记忆事物是最重要的辨别因素,因为它具有某些含义:
使用流程可以为您提供良好(或最终)的封装。由于进程间通信需要特别的努力,因此您将被迫定义一个干净的接口。从主可执行文件中删除应用程序的某些部分是个好主意。也许你可以像这样拆分依赖关系。
例如Process_RobotAi <-> Process_RobotControl
与控制组件相比,AI具有非常不同的依赖性。界面可能很简单:Process_RobotAI --DriveXY--> Process_RobotControl
。
也许你改变了机器人平台。您只需使用该简单接口实现新的RobotControl
可执行文件。您无需触摸甚至重新编译AI组件中的任何内容。
出于同样的原因,它也会在大多数情况下加快编译速度。
编辑:为了完整起见,我会无耻地添加其他人提醒我的内容: 崩溃过程不会(必然)使整个应用程序崩溃。
一般情况:
1和2是极端且不需要考虑的场景,其间的所有内容都必须单独决定。
对于使用IPC / RPC的系统的一个好的(或很棒的)示例,请查看ros。