Multithreading 带IPC和线程的Actor系统

Multithreading 带IPC和线程的Actor系统,multithreading,ipc,actor,Multithreading,Ipc,Actor,我说得对吗?如果我有一个带有IPC(进程间通信)和线程的操作系统,我可以简单地将其用作参与者模型。因此,我使用IPC发送和接收消息,并以线程的形式启动新的参与者(实际上是进程,因为我不共享内存)。或者我是否遗漏了演员模型为了适应需求而需要的一些特性 演员需要一个地址:PID 向其他参与者发送消息:IPC 创建新的参与者:流程 这确实是可能的:正如你所说,所有的构建块都在那里 尽管如此,它似乎不是很合适:在actor模型中编程时,通常会创建许多actor,因此actor应该“便宜”。不幸的是,在

我说得对吗?如果我有一个带有IPC(进程间通信)和线程的操作系统,我可以简单地将其用作参与者模型。因此,我使用IPC发送和接收消息,并以线程的形式启动新的参与者(实际上是进程,因为我不共享内存)。或者我是否遗漏了演员模型为了适应需求而需要的一些特性

  • 演员需要一个地址:PID
  • 向其他参与者发送消息:IPC
  • 创建新的参与者:流程

    • 这确实是可能的:正如你所说,所有的构建块都在那里

      尽管如此,它似乎不是很合适:在actor模型中编程时,通常会创建许多actor,因此actor应该“便宜”。不幸的是,在大多数操作系统上,进程并不便宜:

      • 首先,在典型系统上,PID的数量是有限的。现在,您可以增加
        pid\u max
        以在一定程度上绕过此问题,但这已经表明您正在使用此工具
      • 一个进程可能会有一些状态,因此它需要一些内存页来存储该状态。即使使用进程间智能复制的写操作技巧,与每个参与者拥有一个进程相比,在一个进程内拥有多个参与者可能更高效(除非您开始在进程间共享内存,但您提到您不想这样做,而且似乎很难保证安全)
      • 有这么多进程意味着内核调度器必须调度所有进程。我会担心它是否会被这一点压倒:这将是一个相当不寻常的工作负载,典型的调度器可能不会针对这一点进行优化。传统的actor系统不是每个actor使用一个线程,而是“在内部”跟踪消息队列,并使用有限数量的线程为所有actor提供服务。只要参与者不阻塞线程,并且线程数量接近CPU数量,这将非常有效
      • 故障处理(如果进程崩溃怎么办?)似乎很难跨进程处理

      总之,这是可能的,但我不确定这是否是个好主意。不过,看看尝试时效果如何会很有趣

      这确实是可能的:正如你所说,所有的构建块都在那里

      尽管如此,它似乎不是很合适:在actor模型中编程时,通常会创建许多actor,因此actor应该“便宜”。不幸的是,在大多数操作系统上,进程并不便宜:

      • 首先,在典型系统上,PID的数量是有限的。现在,您可以增加
        pid\u max
        以在一定程度上绕过此问题,但这已经表明您正在使用此工具
      • 一个进程可能会有一些状态,因此它需要一些内存页来存储该状态。即使使用进程间智能复制的写操作技巧,与每个参与者拥有一个进程相比,在一个进程内拥有多个参与者可能更高效(除非您开始在进程间共享内存,但您提到您不想这样做,而且似乎很难保证安全)
      • 有这么多进程意味着内核调度器必须调度所有进程。我会担心它是否会被这一点压倒:这将是一个相当不寻常的工作负载,典型的调度器可能不会针对这一点进行优化。传统的actor系统不是每个actor使用一个线程,而是“在内部”跟踪消息队列,并使用有限数量的线程为所有actor提供服务。只要参与者不阻塞线程,并且线程数量接近CPU数量,这将非常有效
      • 故障处理(如果进程崩溃怎么办?)似乎很难跨进程处理

      总之,这是可能的,但我不确定这是否是个好主意。不过,看看尝试时效果如何会很有趣

      是的,您可以创建简单的IPC baced演员模型,如乒乓球。然而,有几个问题:

    • 你打算如何监督衍生演员?也就是说,如果您将收到
      SIGCHILD
      ,那么主管(也称为父进程)将几乎不知道故障原因,或者从子进程向主管发送一些更复杂的消息,即描述故障原因

    • 参与者应相互沟通,即存在N对N的逻辑连接。您计划使用什么IPC机制?使用共享内存(因为actors编号是动态的,并且在运行时进行了配置)或为每对actor使用socket将非常困难。套接字在系统中也是有限的,它们很快就会耗尽(O(N^2),N-参与者的数量)

    • 您计划如何进行演员发现?也就是说,你需要一个提供特定服务的特定参与者。参与者通过
      PID
      (系统定义,从程序的角度看不可预测)来识别。actor-X如何能够发现actor-Y的
      PID
      ,您知道,它应该提供一些Y服务?您可以在启动时预先生成所有参与者,然后您将知道他们的所有地址(
      PIDs
      ),但是您如何计划根据需要动态生成新参与者,并让已经生成的参与者知道新的
      PIDs

    • 在您的系统中,参与者之间的消息传递将产生巨大的开销,因为它将通过内核(即进程之间的切换)进行中介,而与您使用哪个IPC无关。每秒能够传递700万条乒乓球消息(当它们在同一个线程上,200万个参与者在不同的线程上时)


    • <>我建议你看看现有的C++实现,即演员模型,或者说他们已经解决了所描述的问题(以及许多其他问题)。p> 是的,您可以创建简单的IPC baced演员模型,如乒乓球。然而,有几个问题: