使用一个流程来同时发出多个其他流程的信号"

时间:2016-04-22 18:06:14

标签: c linux multithreading posix

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

目前,我已通过以下方式实施此项目:

  1. 时间源程序启动,创建共享内存段,创建一个空的PID列表,然后解锁该段。
  2. 每次启动一个客户端程序时,它们会转到共享内存,将自己的pid添加到列表中,然后将其解锁。
  3. 时间源有一个定时器,而不是每10ms关闭一次。每次定时器关闭时,他都会循环显示pid列表,并向其中的每个人发送信号。
  4. 这种方法大多运作良好,但我希望它可以改进。我目前有两个要点:

    1. 很少,传递到其中一个客户端进程的信号会偏差约2毫秒左右。最终结果是: | 12ms | 8ms | 而不是 | 10ms | 10ms |
    2. 第二个问题是所有客户端程序实际上都是多线程的并且做了很多工作(尽管只有原始线程负责处理信号)。如果我同时运行多个客户端进程,则信号的传递会变得更加糟糕和倾斜,就好像它们在系统更加繁重时更难以交付(即使客户端进程已准备就绪并等待中断)。
    3. 我应该考虑采取哪些其他方法来做这类事情?我考虑了以下内容(全部在共享内存段中):

      • 使用volatile uin8_t标志(由时间源进程设置,由客户端清除)。
      • 使用信号量,但如果时间源进程正在运行,并且客户端尚未启动,我如何防止反复增加信号量?
      • 条件变量,虽然似乎不是可以在不相关进程之间的共享内存中使用的解决方案。

1 个答案:

答案 0 :(得分:1)

即使进程处于等待状态,准备接收信号,也不意味着内核将要安排任务,特别是当运行状态下的大多数任务都比可用的CPU核心要多时。 / p>

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