当前位置:  技术问答>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死掉,机器跟死机没有什么两样  
 
也就是高优先级线程永远无法强占低优先级线程....  
 
为什么?????

|
帮顶
学过点操作系统,不太明白,单纯的先进先出是不支持抢占,也没有优先级的说法了,只有先来后到

|
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类型而且有优先权的进程,可以抢占当前正在运行的具有相同优先权的进程。

|
晕,忘了,我的机器是双核的,等我绑定cpu再试试

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3