Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 并发性:进程与线程_Multithreading_Process_Erlang_Otp - Fatal编程技术网

Multithreading 并发性:进程与线程

Multithreading 并发性:进程与线程,multithreading,process,erlang,otp,Multithreading,Process,Erlang,Otp,使用基于进程的并发模型的主要优势是什么 基于线程,在什么环境下后者才合适?使用基于进程的模型的缺点是速度较慢。您必须在程序的并发部分之间复制数据 使用基于线程的模型的缺点是可能会出错。这听起来可能有点意思,但这是真的——给我看基于线程的代码,我会给你看一个bug。我在已经“正确”运行了10年的线程代码中发现了bug 使用基于流程的模型的优点很多。这种分离迫使你从协议和正式的通信模式的角度来思考,这意味着你更有可能做到正确。相互通信的进程更容易跨多台机器扩展。多个并发进程允许一个进程崩溃,而不必使

使用基于进程的并发模型的主要优势是什么
基于线程,在什么环境下后者才合适?

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


使用基于线程的模型的缺点是可能会出错。这听起来可能有点意思,但这是真的——给我看基于线程的代码,我会给你看一个bug。我在已经“正确”运行了10年的线程代码中发现了bug

使用基于流程的模型的优点很多。这种分离迫使你从协议和正式的通信模式的角度来思考,这意味着你更有可能做到正确。相互通信的进程更容易跨多台机器扩展。多个并发进程允许一个进程崩溃,而不必使其他进程崩溃

使用基于线程的模型的优点是速度快


很明显,我更喜欢这两种方式中的哪一种,但如果不是这样的话:流程,一周中的每一天,周日两次。线程太难了:我从未见过任何人能够编写正确的多线程代码;那些声称有能力的人通常还不太了解空间。

容错性和可伸缩性是使用进程与线程的主要优势

如果系统依赖于共享内存或其他某种技术(仅在使用线程时可用),则当您希望在多台计算机上运行系统时,该系统将毫无用处。迟早您将需要在不同的流程之间进行通信

例如,在使用进程时,您必须通过消息处理通信,这就是Erlang处理通信的方式。数据不共享,因此不存在数据损坏的风险

进程的另一个优点是,它们可能会崩溃,您只需重新启动它们(甚至跨网络主机)就可以感到相对安全。但是,如果一个线程崩溃,它可能会使整个进程崩溃,从而导致整个应用程序崩溃。举例说明:如果Erlang进程崩溃,您只会丢失该电话或webrequest等,而不会丢失整个应用程序

综上所述,操作系统进程也有许多缺点,这些缺点会使它们更难使用,比如产生一个新进程需要很长时间。然而,Erlang有自己的进程概念,这是非常轻量级的


话虽如此,这次讨论确实是一个研究课题。如果您想了解更多细节,可以阅读Joe Armstrong关于容错系统的论文]它解释了很多关于Erlang及其驱动原理。

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


Erlang进程与OS进程不同。Erlang进程非常轻量级,在同一个OS线程中可以有许多Erlang进程。请参见

首先,进程与线程的主要区别在于其内存处理方式:

Process = n*Thread + memory region  (n>=1)
进程有自己的独立内存。 进程可以有多个线程

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

记忆是最重要的辨别因素,因为它有一定的含义:

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

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

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

    一般而言:

  • 要创建高度并发或同步的东西,例如具有n>>1个并行运行的实例并共享数据的算法,请使用线程
  • 拥有一个包含多个组件的系统,这些组件不需要共享数据或算法,也不需要频繁交换数据,而是使用流程。如果使用RPC库进行进程间通信,则可以获得一个网络可分发的解决方案,而无需额外成本
  • 1和2是极端的、不需要动脑筋的场景,两者之间的一切都必须单独决定

    关于使用IPC/RP的系统的一个很好(或很棒)的例子