gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:37:21 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

关于c - 使用一个进程向多个其他进程发送信号 "simultaneously",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com