并发:进程与线程

时间:2010-11-30 15:21:35

标签: multithreading process erlang otp

使用基于进程的并发模型的主要优点是什么? 基于线程以及后者适用于什么情境?

4 个答案:

答案 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)

进程有自己独立的内存。 进程可以有多个线程。

进程在操作系统级别上彼此隔离。 线程在此过程中与其对等方共享内存。 (这通常是不可取的。有一些库和方法可以解决这个问题,但这通常是操作系统线程上的一个人工层。)

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

  1. 在进程之间交换数据比在线程之间慢。打破进程隔离总是需要一些内核调用和内存重映射的参与。
  2. 线程比进程更轻量级。操作系统必须为每个进程分配资源并进行内存管理。
  3. 使用进程可以实现内存隔离和同步。线程之间共享内存访问的常见问题与您无关。由于您必须特别努力在进程之间共享数据,因此您很可能会自动与之同步。
  4. 使用流程可以为您提供良好(或最终)的封装。由于进程间通信需要特别的努力,因此您将被迫定义一个干净的接口。从主可执行文件中删除应用程序的某些部分是个好主意。也许你可以像这样拆分依赖关系。 例如Process_RobotAi <-> Process_RobotControl 与控制组件相比,AI具有非常不同的依赖性。界面可能很简单:Process_RobotAI --DriveXY--> Process_RobotControl。 也许你改变了机器人平台。您只需使用该简单接口实现新的RobotControl可执行文件。您无需触摸甚至重新编译AI组件中的任何内容。

    出于同样的原因,它也会在大多数情况下加快编译速度。

    编辑:为了完整起见,我会无耻地添加其他人提醒我的内容: 崩溃过程不会(必然)使整个应用程序崩溃。

    一般情况:

    1. 想要创建高度并发或同步的内容,例如并行运行n&gt;&gt; 1实例并共享数据的算法,请使用线程。
    2. 拥有一个不需要共享数据或算法的多个组件的系统,也不会经常交换数据,使用进程。如果您使用RPC库进行进程间通信,则可以免费获得网络可分发的解决方案。
    3. 1和2是极端且不需要考虑的场景,其间的所有内容都必须单独决定。

      对于使用IPC / RPC的系统的一个好的(或很棒的)示例,请查看ros