软实时Linux调度

时间:2014-02-19 03:17:31

标签: c linux embedded real-time rtos

我有一个具有一些软实时要求的项目。我有两个进程(我编写的程序)进行一些数据采集。在任何一种情况下,我都需要不断读入正在进入并处理它的数据。

第一个程序是高度线程化的,第二个程序使用进行线程化的库,但我不知道幕后发生了什么。每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为20,漂亮的值为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。

  4. 我遇到了以下障碍:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

(1)pthread_mutex_setprioceiling

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

(3)既然你现在不知道是什么原因造成的,那么任何人都可以保证公平地说这是公平的。