我有一个需要满足一些软实时需求的项目。我有两个进程(我编写的程序)进行数据采集。在任何情况下,我都需要不断读取并处理输入的数据。
第一个程序非常线程化,第二个程序使用了一个库,应该是经过了线程化处理,但我不知道底层正在发生什么。每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为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引起缓冲区溢出的问题?
第一个程序非常线程化,第二个程序使用了一个库,应该是经过了线程化处理,但我不知道底层正在发生什么。每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为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引起缓冲区溢出的问题?