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)
进程有自己的独立内存。
进程可以有多个线程
进程在操作系统级别上相互隔离。
线程在此过程中与对等线程共享内存。
(这通常是不可取的。有一些库和方法可以解决这一问题,但这通常是操作系统线程上的一个人工层。)
记忆是最重要的辨别因素,因为它有一定的含义:
Process\u RobotAi Process\u RobotControl
与控制组件相比,人工智能将具有截然不同的依赖性。界面可能很简单:Process\u RobotAI--DriveXY-->Process\u RobotControl
。
也许你可以换个机器人平台。你只需要用这个简单的界面实现一个新的RobotControl
可执行文件。你不必触摸甚至重新编译AI组件中的任何内容
出于同样的原因,它还将在大多数情况下加快编译速度
编辑:为了完整起见,我会无耻地添加其他人提醒我的内容:
崩溃进程不会(必然)使整个应用程序崩溃
一般而言: