发新话题
打印

@@@实时线程问题请教@@@

@@@实时线程问题请教@@@

打算在一个线程中进行计时,故此开了一个线程如下
void *thread_child (void *data)
{
   int count = 1;
   struct timeval tStart, tEnd;
   long timeuse;
   while(1)
   {
      count++;
      gettimeofday(&tStart,NULL);//取得开始的时间
      usleep(1000);
      gettimeofday(&tEnd,NULL);
      timeuse = 1000000*(tEnd.tv_sec - tStart.tv_sec)   + (tEnd.tv_usec - tStart.tv_usec);
      printf("time:%d\n",timeuse);
   }
}
1、如果该线程定义为普通线程,则如果程序中存在两个线程运行,usleep的时间<10000us,则打印出的time为20ms左右,
2、如果该线程定义为SCHED_RR线程,另外一个线程定义为普通线程,则如果程序中的usleep部分的睡眠时间<2000us打印出的time跟usleep中的数值范围接近,但是只要超过2000us,即使是2010us,打印出的时间也是20ms左右,
对于1我认为,只要调用sleep主动阻塞线程,则下次调用的时间应该是系统的一个时间片之后,(我得linux版本为2。4板,一个时间片为10ms,),所以只要usleep中的数值不炒过一个时间片,程序打印的时间也就是一个时间片,不知我得理解对不?,如果理解的对为什么系统时间片为10ms,间隔确实20ms呢?
对于2的前半部分我的理解该线程睡眠完毕后因为优先级高,所以立刻抢占其他线程的时间,所以打印的时间跟睡眠的时间相接近,但是为什么大于2000后,打印的时间变成了20ms就理解不了了,希望哪位大侠能指点一下,我觉得实时线程应该随时可以抢占别的普通线程的时间运行,所以应该所有的情况,打印的时间都跟睡眠的时间一致才对,但是试验结果不对,请大家指点啊.

[ 本帖最后由 dynamic221 于 2007-9-19 15:24 编辑 ]      

TOP

SCHED_RR之代表是使**转调度策略,并不一定优先级就高,除非你显式设定了优先级,至于20ms,我怀疑你的系统本身就是20ms的时间片,虽然2.4内核默认为10ms,但这是可以修改的。

[ 本帖最后由 zltjiangshi 于 2007-10-26 20:37 编辑 ]      
1,本人乃Linux伊甸园“Linux内核学习”,“红旗等发行版”版主,请大家捧场。
2,红旗Linux在设备驱动,系统设置,中文美化,易用性方面做得非常好,建议大家使用。
3,本人是红旗Linux的粉丝,不是枪手。

TOP

发新话题