软实时Linux调度

8
我有一个需要满足一些软实时需求的项目。我有两个进程(我编写的程序)进行数据采集。在任何情况下,我都需要不断读取并处理输入的数据。
第一个程序非常线程化,第二个程序使用了一个库,应该是经过了线程化处理,但我不知道底层正在发生什么。每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为20,好处值为0。每个程序大约使用30%的CPU。
现在,这两个进程必须与一些后台进程竞争,我希望我的两个程序能够尽可能地获得CPU。我的主要问题是我有一个设备,我需要访问它,它有一个64字节硬件缓冲区,如果我不能及时地从中读取数据,就会导致溢出。我注意到这种情况每2-3小时运行一次。
根据我的研究,(http://oreilly.com/catalog/linuxkernel/chapter/ch10.html),似乎有三种改变优先级的方法:
1.将好处值设置为较低的数字,因此为每个进程提供更多的优先级。 我可以使用nice命令执行此操作而无需修改代码(或使用系统调用)。
2.将sched_setscheduler()用于整个进程以使用特定的调度策略。
3.使用pthread_setschedparam()单独设置每个pthread。
我遇到了以下障碍:
1.如果我选择第三种方法,如何防止优先级较低的线程被饿死?是否有方法可以确保共享锁导致优先级较低的线程升级到更高的优先级?假设我有一个实时的SCHED_RR线程,并且它与一个默认的SCHED_OTHER线程共享锁。当SCHED_OTHER线程获取锁时,我希望它以更高的优先级执行以释放锁。我该如何确保这一点?
2.如果SCHED_RR的线程创建另一个线程,新线程是否自动为SCHED_RR?如果我将一个进程设置为SCHED_RR,则所有线程是否自动遵循此策略?如果SCHED_RR的进程产生子进程,它也会自动成为SCHED_RR吗?
3.如果代码仅使用60%的CPU,是否真的要担心与后台进程共享CPU引起缓冲区溢出的问题?

64字节的硬件缓冲区不应该有影响,因为驱动程序应该比那个拥有更多的缓冲空间。你是如何与驱动程序通信的? - Martin James
芯片本身是一个i2c到uart的桥接器,只能容纳64字节的UART数据。目前我正在通过打开/dev/i2c文件来连续轮询芯片。据我所知,没有更好的驱动程序可用,而且我时间紧迫,没有时间去组装更好的东西。 - It'sPete
最高优先级的阻塞读取不够快吗? - Martin James
对于99%的情况,这是可以的,但我每隔几个小时就会有1个FIFO溢出。实际上,我已经将程序的好感度提高到-20,但我还没有看到问题,但可能需要进行更多的测试。我知道我正在进行I / O等效于使用一些止痛药治愈脑肿瘤,但看起来它做到了。 - It'sPete
1个回答

2
(1) pthread_mutex_setprioceiling:pthread_mutex_setprioceiling是一个函数,用于将互斥锁的优先级设置为指定值。
(2) 新创建的线程继承其创建线程的调度和优先级,除非调用pthread_create时线程属性(例如pthread_attr_setschedparam/pthread_attr_setschedpolicy)被指示以其他方式执行。
(3) 由于现在你不知道导致它的原因,因此任何人都很难确切地说出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接