当前位置: 技术问答>linux和unix
*****SCHED_FIFO线程的无法抢占问题,我给100分,不够的话,另开贴送分 *****
来源: 互联网 发布时间:2016-02-27
本文导语: FIFO线程似乎不支持抢占,低优先级线程一旦运行起来,如果它不主动释放CPU,高优先级任务就一直得不到执行。下面是我的代码 (kernel is :uclinux2.6) void* thd1(void* lpparam)//线程1 { ...
FIFO线程似乎不支持抢占,低优先级线程一旦运行起来,如果它不主动释放CPU,高优先级任务就一直得不到执行。下面是我的代码
(kernel is :uclinux2.6)
void* thd1(void* lpparam)//线程1
{
sleep(1);//休眠使的MAIN可以有机会创建线程2
while(1);
}
void* thd2(void* lpparam)//线程2
{
sleep(3);//等线程1运行2秒后,再抢占CPU
while(1){
printf(“thd2 preempt!”); //这是理想输出的结果
}
}
int create_fifo_thd(void(* routine)(void* param),int dwPriority)
{
pthread_attr_t Attr;
pthread_attr_init(&Attr);
pthread_attr_setschedpolicy(&Attr,SCHED_FIFO);
pthread_attr_setdetachstate(&Attr,PTHREAD_CREATE_DETACHED);
struct sched_param sch_param;
sch_param.sched_priority = dwPriority;
pthread_attr_setschedparam(&Attr,&sch_param);
pthread_t pid = 0;
pthread_create(&pid,&Attr,routine,0);
pthread_attr_destroy(&Attr);
return pid;
}
int main()
{
int ret = 0;
ret = create_fifo_thd(thd1,11);//低优先级(优先级换成12,运行效果相同)
if(0 == ret)return 0;
ret = create_fifo_thd(thd2,12);//高优先级(优先级换成11,运行效果相同)
if(0 == ret)return 0;
printf(“pthread_create ok!n”);
while(1)sleep(1);
}
运行结果:
pthread_create ok!
然后SHELL死掉,机器跟死机没有什么两样
也就是高优先级线程永远无法强占低优先级线程....
为什么?????
(kernel is :uclinux2.6)
void* thd1(void* lpparam)//线程1
{
sleep(1);//休眠使的MAIN可以有机会创建线程2
while(1);
}
void* thd2(void* lpparam)//线程2
{
sleep(3);//等线程1运行2秒后,再抢占CPU
while(1){
printf(“thd2 preempt!”); //这是理想输出的结果
}
}
int create_fifo_thd(void(* routine)(void* param),int dwPriority)
{
pthread_attr_t Attr;
pthread_attr_init(&Attr);
pthread_attr_setschedpolicy(&Attr,SCHED_FIFO);
pthread_attr_setdetachstate(&Attr,PTHREAD_CREATE_DETACHED);
struct sched_param sch_param;
sch_param.sched_priority = dwPriority;
pthread_attr_setschedparam(&Attr,&sch_param);
pthread_t pid = 0;
pthread_create(&pid,&Attr,routine,0);
pthread_attr_destroy(&Attr);
return pid;
}
int main()
{
int ret = 0;
ret = create_fifo_thd(thd1,11);//低优先级(优先级换成12,运行效果相同)
if(0 == ret)return 0;
ret = create_fifo_thd(thd2,12);//高优先级(优先级换成11,运行效果相同)
if(0 == ret)return 0;
printf(“pthread_create ok!n”);
while(1)sleep(1);
}
运行结果:
pthread_create ok!
然后SHELL死掉,机器跟死机没有什么两样
也就是高优先级线程永远无法强占低优先级线程....
为什么?????
|
帮顶
学过点操作系统,不太明白,单纯的先进先出是不支持抢占,也没有优先级的说法了,只有先来后到
学过点操作系统,不太明白,单纯的先进先出是不支持抢占,也没有优先级的说法了,只有先来后到
|
fifo模式线程好像是只有其结束运行后才能选择其他线程执行(根据优先级顺序),试一下循环模式吧
|
SCHED_FIFO实现了一种简单的、先入先出的调度算法, 它不使用时间片。 SCHED_FIFO级的进程回比任何SCHED_NORMAL级的进程都先得到调度。 一旦一个SCHED_FIFO级进程处于可执行状态,就会一直执行,直到它自己阻塞或者显式地释放处理器为止;它不基于时间片,可以一直执行下去。只有较高优先级的SCHED_FIFO或者SCHED_RR任务才能抢占SCHED_FIFO任务。如果有两个或者更多的SCHED_FIFO级进程,它们会轮流执行,但是在它们愿意让出处理器时会再次让出。 只要有SCHED_FIFO级进程在执行,其他级别较低的进程就只能等待它结束后才有机会执行。
|
楼主,我运行了你的代码,一切正常.
运行环境:CentOS ,kernel:2.6.18 gcc:4.1.2
先进先出(FIFO)是一种没有时间片的非常简单的实时策略。只要没有更高优先权的进程变为可运行,FIFO类型的进程就会一直运行。FIFO类型由宏SCHED_FIFO描述。 由于这个调度策略没有时间片,它运转的规则非常简单:
一个可运行FIFO类型的进程,如果它的优先权在系统中最高,则它会一直运行。特别地,一旦FIFO类型的进程成为可运行,它就会立即抢占普通进程。
FIFO类型的进程会持续运行,直到阻塞或者调用sched_yield(),或者直到另一个更高优先权进程变为可运行。
当一个FIFO类型的进程阻塞时,调度器把它从可运行进程列表中移除。当它再次成为可运行时,它将会按优先权被插入到列表的末尾。因此,在其它相同或者更高优先权进程结束执行之前,这个进程将不会得到运行。
当一个FIFO类型的进程调用sched_yield()时,调度器根据它的优先权把它移动到列表的末尾。因此,在其它相同优先权进程结束执行之前它将不会再次运行。如果调用进程优先权最高且唯一,sched_yield()将没有任何效果。
当一个更高优先权的进程抢占一个FIFO类型的进程时,FIFO进程保留在进程列表的相同位置上。因此,一旦更高优先权进程结束执行,被抢占的FIFO类型进程会马上继续执行。
当一个进程加入FIFO类型,或者当一个进程的静态优先权变化时,它会被放置在相同优先权进程列表的开头。因此,一个新的FIFO类型而且有优先权的进程,可以抢占当前正在运行的具有相同优先权的进程。
运行环境:CentOS ,kernel:2.6.18 gcc:4.1.2
先进先出(FIFO)是一种没有时间片的非常简单的实时策略。只要没有更高优先权的进程变为可运行,FIFO类型的进程就会一直运行。FIFO类型由宏SCHED_FIFO描述。 由于这个调度策略没有时间片,它运转的规则非常简单:
一个可运行FIFO类型的进程,如果它的优先权在系统中最高,则它会一直运行。特别地,一旦FIFO类型的进程成为可运行,它就会立即抢占普通进程。
FIFO类型的进程会持续运行,直到阻塞或者调用sched_yield(),或者直到另一个更高优先权进程变为可运行。
当一个FIFO类型的进程阻塞时,调度器把它从可运行进程列表中移除。当它再次成为可运行时,它将会按优先权被插入到列表的末尾。因此,在其它相同或者更高优先权进程结束执行之前,这个进程将不会得到运行。
当一个FIFO类型的进程调用sched_yield()时,调度器根据它的优先权把它移动到列表的末尾。因此,在其它相同优先权进程结束执行之前它将不会再次运行。如果调用进程优先权最高且唯一,sched_yield()将没有任何效果。
当一个更高优先权的进程抢占一个FIFO类型的进程时,FIFO进程保留在进程列表的相同位置上。因此,一旦更高优先权进程结束执行,被抢占的FIFO类型进程会马上继续执行。
当一个进程加入FIFO类型,或者当一个进程的静态优先权变化时,它会被放置在相同优先权进程列表的开头。因此,一个新的FIFO类型而且有优先权的进程,可以抢占当前正在运行的具有相同优先权的进程。
|
晕,忘了,我的机器是双核的,等我绑定cpu再试试
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。