| WinCE | 嵌入式Linux |
| 100ms | 10ms |
| 1ms | 10ms |
while( bFlag == FALSE )
{
}
线程的调度策略分为3个:SCHED_OTHER,SCHED_FIFO,SCHED_RR。
SCHED_OTHER是非实时分时调度策略,线程优先级为0;
试验结果(linux2.6 Montavista 5.0):每个线程都不能强占其它线程,但是线程都受到时间片的限制,并不是线程不主动退出(包括被阻塞),就会一直占用。
但是在sun公司的 《多线程编程手册》中,其说这种情况 线程会一直占用。
SCHED_FIFO是实时先进先出调度策略,即一当占用CPU,除非自己阻塞或结束或有更高优先级线程,否则会一直运行,线程优先级为1-99;
线程会按不同的优先级来分为不同的队列,同优先级的线程是按FIFO来调度的。
SCHED_RR是实时分时调度策略,其不会一直占用CPU,运行一个时间片后会让出CPU给自己同优先级的线程;其实SCHED_RR与SCHED_FIFO基本是相似的,只是前者会受到时间片的限制,相同优先级的线程,用时间片来调度。而FIFO的话,正在运行的线程,是不会被其他同优先级线程强占的,除非自己主动退出或被阻塞。所以在采用FIFO策略时,千万别使用一直占用的线程(不主动退出,也没有挂起的条件),否则其他同优先级线程永远不会运行了。这种情况最好使用RR策略。
指出:SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。实时调度策略会抢占非实时调度策略,即只要有SCHED_FIFO或SCHED_RR这两个实时调度策略的线程,像SCHED_OTHER的非实时调度策略的线程就不会得到运行,除非所有的实时调度策略的线程阻塞或结束。
Linux线程优先级设置
首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:
int int |
SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。
设置和获取优先级通过以下两个函数:
int int |
例如以下代码创建了一个优先级为10的线程:
struct { }; |
例:创建优先级为10的线程
pthread_attr_t struct pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, param.sched_priority pthread_attr_setschedparam(&attr, pthread_create(xxx pthread_attr_destroy(&attr); |