c语言 - 使用一个进程向多个其他进程发出信号 "simultaneously"



我有两个不同的应用程序必须一起工作。 进程 1 充当时间源,进程 2 根据进程 1 提供的时间源执行操作。 我需要运行进程 2 的多个副本。 目标是让一次性源进程同时发出 5-10 个其他进程的信号,以便它们同时执行工作。

目前,我通过以下方式实现了这一点:

  1. 时间源程序启动,创建一个共享内存段,创建一个空的 PID 列表,然后解锁该段。
  2. 每次其中一个客户端程序启动时,它们都会转到共享内存,将自己的 pid 添加到列表中,然后将其解锁。
  3. 时间源有一个计时器,每 10 毫秒关闭一次。每次计时器响起时,他都会循环浏览 pid 列表,并背靠背向其中的每个人发送信号。

这种方法大多效果很好,但我希望它可以改进。 我目前有两个症结:

  1. 在极少数情况下,传递到其中一个客户端进程的信号会偏差 ~2 毫秒左右。 最终结果是: | 12毫秒 | 8毫秒 |而不是 | 10毫秒 | 10毫秒 |.
  2. 第二个问题是,所有客户端程序实际上都是多线程的,并且做了大量的工作(尽管只有原始线程负责处理信号)。 如果我同时运行多个客户端进程,则信号的传递会变得更加零星和偏斜,就好像当系统负担更重时它们更难交付一样(即使客户端进程已准备就绪并等待中断)。

我应该考虑哪些其他方法来做这类事情? 我已经考虑了以下内容(都在共享内存段中):

  • 使用易失性uin8_t标志(由时间源进程设置,由客户端清除)。
  • 使用信号量,但如果时间源进程正在运行,并且客户端尚未启动,如何防止信号量一遍又一遍地递增?
  • 条件变量,尽管似乎没有可以在不相关进程之间的共享内存中使用的解决方案。

即使进程处于等待状态,准备接收信号,也不意味着内核将要调度任务,尤其是当大多数任务处于运行状态时,可用的 CPU 内核。

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

最新更新