【问题标题】:Communicating between a parent and its children父母和孩子之间的沟通
【发布时间】:2011-02-20 09:44:18
【问题描述】:

新手问题:

在 Unix 上,在一个有父级和一些子级的程序中:
- 家长如何有效地提醒孩子做一些工作..?
- 或者孩子们如何等待父母的信号开始做一些工作?

编辑:
该程序尝试并行执行复杂的计算,我已经使用共享内存作为所有子级的公共工作区来更新结果和数据传输。
我现在需要的是父母有效地对所有孩子说“开始”......(多次调用)

谢谢

【问题讨论】:

    标签: linux ipc fork unix


    【解决方案1】:

    您的ipc 标签说明了一切。您需要研究进程间通信:

    • 共享内存。
    • 信号量。
    • 管道。
    • 信号。
    • 内存映射文件。
    • 套接字。

    毫无疑问还有其他可能性,但这是一个好的开始。

    效率在很大程度上取决于您的用例。如果您只需要通知孩子做某事,那么我可能会使用信号。如果您需要在进程之间传输更多信息,最好完全指定要求。


    可能要考虑的一件事是完全绕过所有进程间的东西而只使用线程。至少在 Linux 中,线程是调度程序的一等公民。较旧的 UNIX 可能有所区别(使用用户模式线程),但 Linux 并非如此。

    我发现这样做更简单,并且您的信息会自动共享(请记住,您仍然需要使用互斥锁等保护共享内容)。


    如果您已经致力于共享内存,另一种可能性是使用信号。假设您已经为每个孩子留出了部分记忆(并且他们知道自己在哪里),信号可能是通知一群孩子进行并行工作的最快方式。

    如果您的孩子只是在 select 循环中等待(例如)30 秒超时以执行周期性工作,则信号将导致它立即以 EINTR 退出。这可以让您高效地使用 CPU,同时仍能立即做出响应。

    【讨论】:

    • 我一直在寻找一种有效的方法来做到这一点..例如,在这种情况下,我认为套接字开销不是有效的..
    • @Betamoo,查看更新。这将取决于您的具体需求。并且套接字可以非常快,这取决于实现。数据不需要通过本地套接字的线路输出。
    • @Betamoo,如果不涉及数据传输(孩子已经打开了 shmem),我只会使用信号。它们的效率差不多。
    • @paxdiablo,很好,但还有一件事..每个孩子必须“等待”父信号而不浪费 CPU 周期..(例如,我不想使用无限循环)
    • @Betamoo:这就是pause() 的用途。
    【解决方案2】:

    查看Beej 的 IPC 指南以了解它是如何工作的……它是一个很好的指南。 Beej 还在同一个网站上介绍了套接字。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2020-01-29
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 2019-02-04
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多