基于线程上的过程而不是一个过程以及后者适当的情况,使用模型进行并发的主要优点是什么?

有帮助吗?

解决方案

容错和可伸缩性是使用过程与线程的主要优点。

一个依赖共享内存或仅在使用线程时可用的其他技术的系统,当您想在多台计算机上运行该系统时,将毫无用处。迟早您需要在不同的过程之间进行交流。

例如,当使用流程时,您被迫通过消息处理通信,这就是Erlang处理通信的方式。数据没有共享,因此没有数据损坏的风险。

流程的另一个优点是它们可能会崩溃,并且您可以知道可以重新启动它们(即使在网络主机上)感到相对安全。但是,如果线程崩溃,它可能会崩溃整个过程,这可能会降低您的整个应用程序。为了说明:如果Erlang流程崩溃,您只会丢失该电话,或者Webrequest等。而不是整个应用程序。

在说所有这些方面,操作系统流程也有许多缺点,可以使它们更难以使用,例如永远需要催生新过程的事实。但是,Erlang有自己的流程概念,非常轻巧。

话虽如此,这种讨论确实是一个研究的话题。如果您想获取更多细节,可以给乔·阿姆斯特朗(Joe Armstrong)的易于故障系统的论文1 一读,它解释了很多关于埃尔朗和驱动它的哲学。

其他提示

使用基于过程的模型的缺点是它将较慢。您将必须在程序的并发部分之间复制数据。

使用基于线程的模型的缺点是您可能会弄错它。这听起来很卑鄙,但这是事实 - 根据线程向我展示代码,我将向您展示一个错误。我在“正确”运行10年的线程代码中发现了错误。

使用基于过程的模型的优点很多。分离迫使您在协议和正式沟通模式方面进行思考,这意味着您更有可能使它正确。彼此通信的过程更容易在多个机器上扩展。多个并发过程允许一个过程崩溃,而不必崩溃。

使用基于线程的模型的优点是它很快。

我更喜欢两者中的哪一个很明显,但是如果不是:流程,每天的每一天,周日两次。线程太难了:我从未见过任何人可以编写正确的多线程代码。那些声称能够通常对空间不了解的人。

在这种情况下,过程更加独立于彼此,而线程共享一些资源,例如内存。但是在一般情况下,线程比过程更轻巧。

ERLANG过程与OS进程不同。 Erlang过程非常重量,Erlang可以在同一OS线程中具有许多ERLANG过程。看 从技术上讲,为什么Erlang的过程比OS线程更有效?

首先,过程与线程不同,主要是处理记忆的方式:

Process = n*Thread + memory region  (n>=1)

过程有自己的孤立记忆。过程可以具有多个线程。

过程在操作系统级别彼此隔离。线程在此过程中与同行共享他们的内存。 (这通常是不受欢迎的。那里有库和方法可以解决此问题,但这通常是操作系统线程上的人造层。)

记忆是最重要的辨别因素,因为它具有某些含义:

  1. 交换过程之间的数据比线程之间的数据慢。打破过程隔离始终需要一些内核调用和内存重新映射的参与。
  2. 线程比过程更轻巧。操作系统必须为每个过程分配资源并进行内存管理。
  3. 使用过程可为您提供内存隔离和同步。线程之间共享内存的常见问题与您无关。由于您必须做出特别的努力来共享流程之间的数据,因此您很可能会自动同步。

使用流程可为您提供良好的(或最终)封装。由于相互处理的交流需要特殊的努力,因此您将被迫定义一个干净的界面。将应用程序的某些部分从主要的可执行文件中分解出来是一个好主意。也许您可以这样拆分依赖项。例如 Process_RobotAi <-> Process_RobotControl与对照组件相比,AI的依赖性将大不相同。接口可能很简单: Process_RobotAI --DriveXY--> Process_RobotControl。也许您更改了机器人平台。您只需要实施一个新的 RobotControl 可使用该简单接口。您不必触摸甚至重新编译AI组件中的任何内容。

在大多数情况下,它也将出于相同的原因加快汇编。

编辑:仅仅为了完整性,我将无耻地添加其他人提醒我:崩溃的过程并不一定会崩溃您的整个应用程序。

一般来说:

  1. 想要创建一些高度并发或同步的内容,例如具有n >> 1个实例并并行运行并共享数据的算法,请使用线程。
  2. 具有一个具有多个组件的系统,这些组件不需要共享数据或算法,也不经常使用数据来使用流程。如果您使用RPC库进行相互处理的通信,则无需额外的费用即可获得网络分布解决方案。

1和2是极端和无限制的场景,两者之间的所有内容都必须单独确定。

对于大量使用IPC/RPC的系统的好(或很棒的)示例,请查看 罗斯.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top