【发布时间】:2014-03-19 04:23:50
【问题描述】:
我有一个具有一些软实时要求的项目。我有两个进行数据采集的进程(我编写的程序)。无论哪种情况,我都需要不断地读取传入的数据并对其进行处理。
第一个程序有大量线程,第二个程序使用了一个应该线程的库,但我不知道幕后发生了什么。每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为 20,nice 值为 0。每个程序使用大约 30% 的 CPU。
就目前而言,这两个进程都必须与一些后台进程竞争,我希望让我的两个程序尽可能地利用 CPU。我的主要问题是我有一个与我交谈的设备,它有一个 64 字节的硬件缓冲区,如果我不及时读取它,我就会溢出。我注意到这种情况每运行 2-3 小时就会发生一次。
根据我的研究 (http://oreilly.com/catalog/linuxkernel/chapter/ch10.html),似乎可以通过三种方式来处理优先级:
将 nice 值设置为较小的数字,从而赋予每个进程更高的优先级。我可以使用 nice 命令在不修改我的代码(或使用系统调用)的情况下做到这一点。
使用 sched_setscheduler() 将整个进程用于特定的调度策略。
使用 pthread_setschedparam() 单独设置每个 pthread。
我遇到了以下障碍:
假设我选择了选项 3,如何防止低优先级线程被饿死?还有一种方法可以确保共享锁导致较低优先级的线程提升到较高优先级?假设我有一个实时线程 SCHED_RR 并且它与默认的 SCHED_OTHER 线程共享一个锁。当 SCHED_OTHER 线程获得锁时,我希望它执行@更高的优先级来释放锁。我如何确保这一点?
如果一个SCHED_RR的线程创建另一个线程,新线程是自动SCHED_RR,还是我需要指定这个?如果我有一个设置为 SCHED_RR 的进程,它的所有线程会自动遵循这个策略吗?如果一个 SCHED_RR 的进程产生一个子进程,会不会太自动 SCHED_RR?
考虑到代码只占用了 60% 的 CPU,这有什么关系吗?或者是否仍然存在与后台进程共享 CPU 的问题,我应该关注这些问题并且可能导致我的缓冲区溢出?
很抱歉这个冗长的问题,但我觉得它需要一些背景信息。提前感谢您的帮助。
【问题讨论】:
-
64 字节的硬件缓冲区应该无关紧要,因为驱动程序应该有更多的缓冲区空间。您如何与司机沟通?
-
芯片本身是一个 i2c 到 uart 的桥接器,只能保存 64 字节的 UART 数据。目前我通过打开 /dev/i2c 文件不断地轮询芯片。据我所知,没有更好的驱动程序可用,而且我时间紧迫,没有时间把更好的东西放在一起。
-
最高优先级的阻塞读取不够快?
-
99% 的情况是这样,但我每隔几个小时就会发生 1 次 FIFO 溢出。实际上,我已经将程序的 nice 级别提高到了 -20 并且我还没有发现问题,但可能需要进行更多测试。我知道我正在做的 I/O 相当于尝试用一些止痛药治愈脑瘤,但看起来它确实做到了。
标签: c linux embedded real-time rtos