【问题标题】:Using one process to signal multiple other processes "simultaneously"使用一个进程“同时”向多个其他进程发出信号
【发布时间】:2016-04-22 18:06:14
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 关于您的最后一个选项(SHM 中的条件变量):stackoverflow.com/q/2782883/694576
  • 您可以尝试将所有进程放到同一个进程组中,然后向该组发送信号。
  • 我认为您将准备运行进程所需的时间与准备运行后实际执行进程的时间混淆了。您可以轻松地使用 futex 使任意数量的进程准备好同时运行。共享内存中的条件变量也可以。

标签: c linux multithreading posix


【解决方案1】:

即使一个进程处于等待状态,准备好接收信号,并不意味着内核会安排任务,尤其是当大多数任务处于运行状态时,比可用的 CPU 内核多。

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

【讨论】:

  • 今天早些时候,我开始调整进程的 nice 级别,这完全消除了这个问题。我可以类似地通过有选择地将进程分配给不同的核心(甚至提前保留核心)来解决这个问题。我会研究不同的日程安排选项,但您的反馈符合我的经验。
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多