当前位置: 首页 > 面试题库 >

Erlang进程与Java线程

顾永福
2023-03-14
问题内容

我正在阅读SašaJurić撰写的《行动中的长生不老药》,在第一章中说:

Erlang进程彼此完全隔离。它们不共享内存,并且一个进程的崩溃不会导致其他进程的崩溃。

Java线程也不是真的吗?我的意思是,当Java线程崩溃时,它也不会崩溃其他线程-
尤其是,如果我们正在查看请求处理线程(请将该main线程排除在此讨论之外)


问题答案:

在我之后重复: “这些是不同的范例”

大声说20次左右-这是我们目前的口头禅。

如果我们 真的 必须比较苹果和橙子,那么至少要考虑一下“成为水果”的共同方面在哪里相交。

Java“对象”是Java程序员的基本计算单位。也就是说, 对象 (基本上是具有臂和腿的结构,比C
++更严格地执行了
封装)是建模世界的主要工具。您认为“此对象知道/拥有Data {X,Y,Z}并执行Functions {A(),B(),C()}它,Data随处携带它,并且可以通过调用定义为其公共接口一部分的函数/方法来与其他对象进行通信。它是一个名词,而名词
确实
也就是说,您将思考过程围绕这些计算单元进行。默认情况是,对象之间发生的事情是按顺序发生的,而崩溃会中断该顺序。它们被称为“对象”,因此被称为“对象”。
(如果不考虑艾伦·凯的本义),我们得到“面向对象”。

Erlang“过程”是Erlang程序员的基本计算单位。甲 过程
(基本上在它自己的时间和空间中运行的自包含顺序程序)是主要的工具,利用该模型厄兰格世界(1)。与Java对象定义封装级别相似,Erlang进程也定义了封装级别,但是对于Erlang而言,计算单位是
完全
彼此切断。您不能在另一个进程上调用方法或函数,也不能访问其中包含的任何数据,甚至一个进程都不能在与任何其他进程相同的定时上下文中运行,并且不能保证消息接收相对于其的顺序。到可能正在发送消息的其他进程。它们也可能完全在不同的行星上(并且想起来,这实际上是合理的)。它们可以彼此独立崩溃,而其他过程只有在故意选择要受到影响的情况下才会受到影响(甚至涉及消息传递:本质上是注册以接收来自死进程的自杀记录,而死进程本身并不能保证以任何形式到达相对于整个系统的顺序,您可能会选择也可能不会选择对此做出反应)。

Java用复合算法直接处理复杂性:对象如何协同工作以解决问题。它旨在在单个执行上下文中执行此操作,并且Java中的默认情况是顺序执行。Java中的多个线程表示多个正在运行的上下文,这是一个非常复杂的主题,因为不同时序上下文中的影响活动会相互影响(整个系统也是如此:因此,防御性编程,异常方案等)。用Java说“多线程”
意味着
与Erlang有所不同,事实上,这在Erlang中甚至从未提及,因为它始终是基本情况。请注意,Java线程暗示的是与时间有关的隔离,而不是与内存或可见引用有关的隔离-
Java中的可见性是通过选择私有和公开来手动控制的;系统的通用访问元素必须设计为“线程安全”和可重入的,通过排队机制进行排序,或者采用锁定机制。简而言之:调度是线程/并行Java程序中的手动管理问题。

Erlang在执行时间(调度),内存访问和引用可见性方面将每个进程的运行上下文分开,并通过 完全 隔离算法来简化算法的每个组件 __。
这不仅是默认情况,而且是此计算模型下唯一可用的情况。一旦您的处理序列的一部分超过了消息壁垒,就以永远不知道任何给定操作的顺序为代价,这是因为消息本质上都是网络协议,无法保证可以在给定的时间内执行任何方法调用上下文。这类似于为每个对象创建一个JVM实例,并且仅允许它们跨套接字进行通信-
这在Java中非常麻烦,但这是Erlang设计工作的方式(顺便说一句,这也是该概念的基础如果人们不赞成使用面向Web的包writing,那么编写“
Java微服务”一词便会引起这种流行语-默认情况下,Erlang程序是大量微服务)。所有关于权衡。

这些是不同的范例。我们可以找到的最接近的共性是,从程序员的角度来看,Erlang进程类似于Java对象。如果我们必须找到某种东西来将Java线程与之进行比较……那么,我们根本就不会在Erlang中找到类似的东西,因为Erlang中没有这样的可比概念。打败一匹死马:
这是不同的范例 。如果您使用Erlang编写一些非平凡的程序,这将变得显而易见。

请注意,我说的是“这些是不同的范式”,但还没有涉及OOP与FP的话题。“ Java思维”和“ Erlang思维”之间的区别比OOP与FP更为根本。

尽管Erlang的“面向并发”或“面向过程”的基础确实与Alan
Kay在创造“面向对象”一词时所想到的更接近(2),但这并不是重点。Kay的回答是,通过将Computron切成离散的块,可以降低系统的认知复杂性,因此必须进行隔离。Java做到这一点的方式从本质上讲仍然使它在本质上仍然是过程性的,但是围绕特殊语法在称为“类定义”的高阶调度闭包上构造代码。Erlang通过将每个对象的运行上下文分开来实现此目的。这意味着Erlang东西不能互相调用方法,而Java东西可以。这意味着Erlang东西可以独立崩溃,而Java东西则不能。这种基本差异产生了许多含义,因此就是“不同的范式”。权衡。

脚注:

  1. 顺便说一句,Erlang实现了“ 参与者模型 ”的一个版本,但是由于Erlang早于该模型的普及,因此我们不使用该术语。乔在设计Erlang并撰写论文时并没有意识到。
  2. 艾伦·凯(Alan Kay)在创造 “面向对象” 一词时曾说过很多意思,最有趣的是他对消息传递(从一个具有自己的时间和内存的独立进程进行单向通知)到VS调用(在具有共享内存的顺序执行上下文中调用函数或方法)-以及这些行如何使编程语言所表示的编程接口与下面的实现之间的位模糊。


 类似资料:
  • 问题内容: 在我阅读的问题中,我们建议在进程上使用线程,因为线程速度更快。我决定使用程序的线程来编辑Wikipedia中某个类别的文章。该程序获取要编辑的文章列表,然后将文章划分为10个线程。这样一来,我每分钟进行6-7次编辑,这与我没有使用线程的速度相同。当我启动程序的多个实例并为每个实例指定要处理的类别时,我看到每个进程每分钟可以进行6-7次编辑(我用5个进程进行了测试)。 为什么我的流程更快

  • 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程。 操作系统会为这些进程分配一些执行资源,例如内存空间等。 在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。 我们都知道现代操作系统比如 Mac OS X,UNIX,Linux,Windows 等可以同时运行多个任务。 打个比方,你一边在用浏览器上网,一边在听敲代码,一边用 Markdow

  • 一、进程的状态与转换 运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。 就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。 阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。 注意区别就绪状态和等待状态: 就绪状态

  • 1、进程的概念和特征 (1) 进程的概念 在多道程序环境下,允许多个程序并发执行,此时他们将失去封闭性,并具有间断性和不可再现性的特征。为此引入了进程的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发行和共享性。为此引入了进程的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。 为了是参与并发执行的程序能独立的运行,必须为之配置一个专门的数据结构,称之为进程控制块

  • 9.3.2 进程与线程 操作系统控制处理器在多个程序之间切换执行的过程称为调度。传统的多任务操作系统是以进程为单位进行调度的。进程(process)是指程序的一次执行所形成的实体,每当程序 开始执行,就会创建一个进程。每个进程由程序代码以及一些状态信息(如进程数据的当前 值和当前执行点等)组成,状态信息也称为进程的上下文。 注意,程序与进程是不同的概念。首先,不同程序在计算机中执行,自然形成不同的

  • 问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运