我有一些Windows线程的经验,我正在研究pthreads。我有关于pthread调度的问题。在Windows上,您可以设置流程优先级,在流程中可以设置流程优先级。 Windows Scheduler始终执行具有最高进程优先级的进程,并在循环中处理线程。
现在,对于pthread,您可以通过sched_setscheduler设置scheduler-policy,并为real-time-modi设置优先级。到目前为止,还有什么呢?
问题:
1)如何在不同的进程上安排pthreads?
2)在优先级较低的线程之前执行实时线程还是循环?
3)我怎样才能获得尽可能多的实时行为(例如i / o -signals)以及我能得到多少?
答案 0 :(得分:1)
重要的是要意识到POSIX线程(pthreads)是在标准中指定的,该标准对实现施加了某些最低要求,但也允许它们具有相当大的余地。
pthreads的概念为Thread Scheduling Contention Scope。 pthreads实现必须至少支持PTHREAD_SCOPE_SYSTEM
和PTHREAD_SCOPE_PROCESS
调度争用范围中的一个。
如果某个线程在PTHREAD_SCOPE_SYSTEM
争用范围内进行了调度,则它将在系统上使用PTHREAD_SCOPE_SYSTEM
与所有其他进程和线程进行同等竞争。
如果某个线程是在PTHREAD_SCOPE_PROCESS
争用范围内安排的,那么它只会在同一进程中使用PTHREAD_SCOPE_PROCESS
直接与其他线程竞争。 POSIX未指定如何针对其他进程/线程调度该组线程,但通常在同一进程中使用PTHREAD_SCOPE_PROCESS
的每组线程被视为单个PTHREAD_SCOPE_SYSTEM
实体。
实现通常只支持其中一种 - 例如,Linux仅支持PTHREAD_SCOPE_SYSTEM
调度争用范围。
在pthreads下,可运行的较高优先级线程始终优先于较低优先级的线程执行。如果线程处于相同的优先级,如果线程正在使用SCHED_FIFO
调度策略,那么它将继续运行直到它阻塞或产生;如果它正在使用SCHED_RR
调度策略,那么它在使用其时间量之后也会被抢占。
我不相信POSIX会对实时性能施加任何限制 - 毕竟,实时延迟会受到底层硬件的强烈影响。除了设置实时调度策略(SCHED_FIFO
或SCHED_RR
)之外,您还可以通过使用mlockall(MCL_CURRENT | MCL_FUTURE);
锁定进程内存并在您需要的内存中预先出现故障来获得更具确定性的延迟。 / p>