[英]c++: PThread Scheduling vs. Windows Thread
我对Windows线程有一些经验,正在研究pthreads。 我对pthread调度有疑问。 在Windows上,您可以设置Process-Priority,而在Process中,可以设置Process-Priority。 Windows Scheduler始终执行具有最高进程优先级的进程,并且在进程中以循环方式执行线程。
现在到pthread中,您可以通过sched_setscheduler设置调度程序策略,并设置实时修改的优先级。 一切,莱特到目前为止?
问题:
1)如何在不同的进程上调度pthread?
2)实时线程是否在优先级较低的线程之前执行,或者是否有循环机制?
3)我如何才能获得尽可能多的实时行为(输入/输出信号的费率),我可以得到多少?
重要的是要意识到,POSIX线程(pthreads)是在一个标准中指定的,该标准对实现施加了某些最低要求,但同时也给了它们很大的回旋余地。
pthreads具有线程调度争用范围的概念。 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);
锁定进程内存来获得更多确定性延迟mlockall(MCL_CURRENT | MCL_FUTURE);
并在您需要的内存中进行预故障处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.