gpt4 book ai didi

c - 软实时 Linux 调度

转载 作者:IT王子 更新时间:2023-10-29 00:35:43 27 4
gpt4 key购买 nike

我有一个项目有一些软实时要求。我有两个进程(我编写的程序)进行一些数据采集。无论哪种情况,我都需要持续读取传入的数据并对其进行处理。

第一个程序是大量线程化的,第二个程序使用了一个应该线程化的库,但我不知道幕后发生了什么。每个程序都由用户执行,(默认情况下)我看到每个程序的优先级为 20,nice 值为 0。每个程序使用大约 30% 的 CPU。

就目前而言,两个进程都必须与一些后台进程竞争,我想尽可能让我的两个程序在 CPU 上发挥最佳作用。我的主要问题是我有一个与之通话的设备,它有一个 64 字节的硬件缓冲区,如果我没有及时读取它,我就会溢出。我注意到这种情况每运行 2-3 小时就会发生一次。

根据我的研究 (http://oreilly.com/catalog/linuxkernel/chapter/ch10.html),似乎有三种处理优先级的方法:

  1. 将 nice 值设置为较低的数字,从而为每个进程提供更高的优先级。我可以使用 nice 命令在不修改我的代码(或使用系统调用)的情况下执行此操作。

  2. 对整个进程使用 sched_setscheduler() 以达到特定的调度策略。

  3. 使用 pthread_setschedparam() 单独设置每个 pthread。

我遇到了以下障碍:

  1. 假设我选择了选项 3,我如何防止低优先级线程被饿死?还有一种方法可以确保共享锁导致低优先级线程提升到高优先级吗?假设我有一个实时线程 SCHED_RR,它与默认的 SCHED_OTHER 线程共享一个锁。当 SCHED_OTHER 线程获得锁时,我希望它执行@higher priority 来释放锁。我如何确保这一点?

  2. 如果一个SCHED_RR的线程创建另一个线程,新线程是自动SCHED_RR,还是需要我指定这个?如果我有一个已设置为 SCHED_RR 的进程,它的所有线程是否都自动遵循此策略怎么办?如果一个 SCHED_RR 进程产生一个子进程怎么办,它是否过于自动 SCHED_RR?

  3. 考虑到代码仅使用 60% 的 CPU,这有什么关系吗?或者是否仍然存在与我应该关注的后台进程共享 CPU 的问题并且可能导致我的缓冲区溢出?

抱歉这个冗长的问题,但我觉得它需要一些背景信息。预先感谢您的帮助。

最佳答案

(1) pthread_mutex_setprioceiling

(2) 新创建的线程继承其创建线程的调度和优先级,除非它的线程属性(例如 pthread_attr_setschedparam/pthread_attr_setschedpolicy )在您调用 pthread_create 时被指示不这样做。

(3) 由于您现在不知道是什么原因造成的,所以公平地说,任何人都很难有把握地说出来。

关于c - 软实时 Linux 调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21870318/

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