使用一个进程“同时”发送多个其他进程的信号

问题描述:

我有两个不同的应用程序必须一起工作。进程1充当时间源,进程2根据进程1提供的时间源执行动作。我需要运行进程2的多个副本。目标是让一个时间源进程在相同的时间发送5-10个其他进程时间,所以他们都同时进行他们的工作。使用一个进程“同时”发送多个其他进程的信号

目前,我有这个的实现方式是:

  1. 源程序启动的时间,创造了一个共享内存段,造成PID的空列表,然后解锁段。
  2. 每当其中一个客户端程序启动时,它们将进入共享内存,将它们自己的pid添加到列表中,然后将其解锁。
  3. 时间源有一个定时器,每10ms关闭一次。每次计时器关闭时,他都会在pid列表中循环,并将信号发回给所有人。

这种方法大多运作良好,但我希望它可以改善。我目前有两个困难点:

  1. 很少,传递到其中一个客户端进程的信号会偏斜大约2毫秒左右。最终结果是:| 12ms | 8ms |而不是| 10ms | 10ms |
  2. 第二个问题是所有的客户端程序实际上都是多线程的并且做了很多工作(尽管只有原始线程负责处理信号)。如果我有多个客户端进程同时运行,那么信号的传递会变得更加棘手和扭曲,就好像系统更多的纳税时(即使客户端进程已准备好并等待中断)它们更难交付一样。

我应该考虑采用其他方法来做这种事情吗?我已经考虑了以下内容(全部在共享内存段中):

  • 使用易失性uin8_t标志(由时间源进程设置,由客户端清除)。
  • 使用信号量,但如果时间源进程正在运行,并且客户端还没有启动,我该如何防止信号量反复递增?
  • 条件变量,虽然似乎没有可用于不相关进程之间共享内存的解决方案。
+2

关于您的最后一个选项(SHM中的条件变量):http://*.com/q/2782883/694576 – alk

+2

您可以尝试将所有进程放入同一个进程组并将信号发送到组。 –

+0

我认为你很容易混淆让流程准备好运行所需的时间,以及在准备好运行后真正获得流程执行的时间。您可以轻松使用futex来使任意数量的进程准备好在同一时刻运行。共享内存中的条件变量也可以工作。 –

即使一个进程处于等待状态,准备好接收信号,并不意味着内核要调度任务,特别是当运行状态中的任务多于可用CPU时核心。

调整优先级(或好的级别)或进程和线程会影响内核调度程序。 ¨ 您还可以使用内核中可用的不同调度程序及其参数。

+0

今天早些时候,我开始调整流程的好水平,并完全消除了这个问题。我可以通过有选择地将进程分配给不同的内核(或者甚至提前预留内核)来解决问题。我会研究不同的日程安排选项,但您的反馈与我的经验相符。 – user1764386