【问题标题】:Which IPC is more efficient here?哪个IPC在这里更高效?
【发布时间】:2011-07-07 17:17:25
【问题描述】:

我有一个系统应用程序,它作为一个集合在 unix 上的 12 个进程上运行。有一个监视进程,它与其他 11 个进程交换数据。

IPC 要求是让这 11 个进程与监控进程进行通信,以执行效率最高的方式设计。你们能否权衡以下两个选项,或者建议一个更好的选项。

1) 有一个 UDP 套接字通信,这 11 个进程会定期向监控进程推送数据。监控进程只是监听和捕获足够好的信息。

2) 有一个共享内存实现。所以有 11 个共享内存段,每个共享内存段在 2 个进程(进程 ith 和监视进程)之间共享。

对于共享内存,它似乎更快,但需要锁定/同步,而在 udp 中,内核将数据从一个进程的内存空间复制到另一个进程。

谁能提供更多输入来帮助更好地评估这两种方法。 ?谢谢。

【问题讨论】:

  • 你的意思是 UDP 套接字,还是 Unix 域套接字?

标签: sockets unix operating-system ipc shared-memory


【解决方案1】:

协调共享内存很棘手。父必须知道何时读取 11 个共享内存段中的每一个的哪一部分,并让子知道何时读取了数据以便可以重用共享内存的部分等等。所以,虽然复制可能是更快,其余的协调(可能使用信号量集 - 可能有 22 个信号量,一个用于 11 个通信通道的每个方向)意味着您几乎肯定会发现基于文件描述符的机制更容易编码。 select()poll() 或变体系统调用可用于告诉您何时有数据可供主设备读取。内核处理调度和流控制等所有令人讨厌的问题。

所以,除非您能真正证明您将从共享内存版本中获得性能优势,否则请使用 Unix 域套接字。但是希望得到正确的共享内存实现会失去一些头发(和一些数据)。 (您可以证明将共享内存与粗略的、不正确的同步系统一起使用是否有性能优势;您可能不会在粗略的不正确同步的系统中投入生产。)

【讨论】:

    【解决方案2】:

    在 UDP 中无法保证传送,有时甚至在 localhost 通信中也会丢弃数据包。所以MMF可能会更好。

    【讨论】:

      【解决方案3】:

      这在很大程度上取决于进程需要相互共享多少数据。如果要来回传递大量数据(例如兆字节或千兆字节),那么共享内存将是更有效的方式。如果只有相对少量的数据(千字节或几兆字节),那么基于套接字的方法可能更可取,因为效率并不重要,避免共享内存将使您的系统更加健壮和更易于开发和调试。

      此外,一些内核支持零拷贝网络,在这种情况下,从一个进程向另一个进程发送 UDP 数据包实际上可能根本不需要内核复制数据,而只是将底层 MMU 页面重新映射到目标进程。如果是这种情况,套接字方法将为您提供两全其美的方法(效率和稳健性)。

      【讨论】:

      • 1) 数据将按 avg: 30 kb/min (负载情况约为 60 kb/min) 的顺序排列。 2) 代码的易用性不是问题,因为我们手头有时间和精力使其最注重性能。
      • 每分钟 60 KB 对于现代计算机(即使对于现代嵌入式计算机)来说是微不足道的负载。如果您的负载真的那么低,那么您如何实现事情就无关紧要了。几乎任何合理的机制都将获得良好的性能。当唯一的好处是您可能会看到 0.01% 的 CPU 使用率而不是 0.02% 时,我不会在复杂的机制上花费太多的编程时间。如果是我,我只会使用 TCP(或 UNIX)套接字。
      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2017-11-30
      • 2016-10-18
      • 1970-01-01
      相关资源
      最近更新 更多