- 论坛徽章:
- 0
|
5可用积分
linux实时调度策略有三种
(1)SCHED_OTHER。SCHED_OTHER是面向普通进程的时间片轮转策略。
(2)SCHED_FIFO。SCHED_FIFO策略适用于对响应时间要求比较高,运行所需时间比较短的实时进程。采用该策略时,各实时进程按其进入可运行队列的顺序依次获得CPU。除了因等待某个事件主动放弃CPU,或者出现优先级更高的进程而剥夺其CPU之外,该进程将一直占用CPU运行。
(3)SCHED_RR。SCHED_RR策略适用于对响应时间要求比较高,运行所需时间比较长的实时进程。采用该策略时,各实时进程按时间片轮流使用CPU。当一个运行进程的时间片用完后,进程调度程序停止其运行并将其置于可运行队列的末尾。
下面这个程序是测试SCHED_FIFO的调度策略
int my_policy;
pthread_attr_t thread_attr1;
pthread_attr_t thread_attr2;
void* thread1(void* arg)
{
pthread_attr_getschedpolicy(&thread_attr1, &my_policy);
printf("\nthread1 = %d", my_policy);
int i= 0;
while(i<1000000)
{
printf("while1\n");
i++;
}
}
void* thread2(void* arg) {
pthread_attr_getschedpolicy(&thread_attr2, &my_policy);
printf("\nthread2 = %d", my_policy);
int i= 0;
while(i<1000000){
printf("while2\n");
i++;
}
}
int main(void) {
pthread_t pid1;
pthread_t pid2;
pthread_attr_init(&thread_attr1);
pthread_attr_init(&thread_attr2);
pthread_attr_setschedpolicy(&thread_attr1, SCHED_FIFO); //设置调度策略
pthread_attr_setschedpolicy(&thread_attr2, SCHED_FIFO);
pthread_create(&pid1, &thread_attr1, thread1, NULL);
pthread_create(&pid2, &thread_attr2, thread2, NULL);
pthread_join( pid1,NULL );
pthread_join( pid2,NULL );
return 1;
}
程序运行结果:
thread1 = 1 //代表是FIFO策略
while1
while1
........
........
thread2 = 0 //Other
while2
while2
........
........
while1
........
while2
看这个结果得出,这两个线程是交替运行的。
那我向各位提出疑问:两个线程等级相同,采用FIFO策略,按理说因该由一个运行完后,另一个才会运行,现在怎么交替了。
谢谢你们的回复!
另外内核版本是2.6.16
[ 本帖最后由 PassionUranus 于 2008-10-10 09:41 编辑 ] |
最佳答案
查看完整内容
没有发现你说的问题啊,内核版本多少?lwn上有篇SCHED_FIFO and realtime throttling讲了一些这方面的问题,内核开发者之间还是有分歧的http://lwn.net/Articles/296419/为了防止FIFO调度的程序出问题锁死整个系统,内核会有一个throttling,会保留一部分cpu时间给non-FIFO程序,2.6.25以后的内核中默认值是5%btw:贴代码用代码模式,你贴的程序中还有中文标点[ 本帖最后由 lemoncookie 于 2008-10-9 20:23 编辑 ]
|