所以我在考虑并发与并行之后(我正在准备一个简短的 erlang 教程)以及我们如何拥有既非并发也非并行的东西(例如在一个核心上运行的经典 C hello world),一些并发但不并行的东西(例如,在一个代码上运行多个参与者的 erlang 程序)和并行和并发的东西(例如,在多个内核上运行的先前 erlang 程序)。

但是,我不太确定我们如何才能有一些有意义的并行但不并发的东西;我想我们可以砍掉程序的指令并并行运行它们,但这不会真正产生任何有意义的结果。运行两个不在两个核心上交互的程序是没有并发的并行系统的一个例子吗?不知何故,我觉得可以有一个更好的例子;有任何想法吗?

最佳答案

如果您环顾四周,您会发现对于并发和并行到底是什么存在很多分歧。在能够给出示例之前,您必须根据自己的目的定义它们。

并发有时被定义为多个任务,其顺序无关紧要(因此 A 可以在 B 之前运行,或者 B 可以在 A 之前运行,而不会导致问题)。然而,有时也有一个警告,即 A 和 B 必须朝着共同的目标努力。

并行性通常定义为同时运行的两个任务,例如使用两个处理器或两台独立的计算机。然而,并行性也经常被认为是朝着一个共同的目标努力,因此两个独立的程序可以在多处理器机器上同时执行的事实可能并不是真正的并行性,因为它们彼此无关。

因此,根据定义,没有并发可能不可能有并行,因为(根据这些定义)并行意味着并发。一旦您对并发性和并行性有了具体的定义,那么您就可以弄清楚这些示例应该是什么样子的。

如果我在 Erlang 教程中解释这一点,我可能会完全避免提及并发性和并行性,因为它们太困惑了。我想说的是 Erlang 具有彼此独立工作的进程,但它们可以通过消息传递进行通信。如果硬件支持它,或者如果使用多个 Erlang 节点,这些进程实际上可能同时运行。否则,就我们而言,Erlang 将它们安排为 出现 以同时运行。这涵盖了并发和并行的广泛思想,希望不用担心对定义的毫无意义的争吵

注意:上述并发性和并行性的示例定义并不详尽或具有权威性。它们仅用于说明目的。

关于并发/并行组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19951050/

10-16 10:28