关于多线程时间片的问题

时间:2022-06-01 20:20:16
现象:采用多线程编程中,我定义了6个线程,采用的是SCHED_RR实时调度策略。我开始想测试一下各个线程运行的时间。于是在其中一个线程里面设置了个外部管脚的周期脉冲信号,其余线程不做任何操作。
运行后,通过示波器监测的波形推算出每个线程运行了大约100ms后切换到下一个线程。我于是将 linux/include/asm-arm/param.h和 linux/include/asm-arm/arch-s3c2410/param.h文件中的HZ由100修改为1000。示波器再次监测后发现每个线程还是运行了100ms。
问题:
1、设置采用SCHED_RR实时调度策略后,每个线程的运行时间是固定为100ms吗?
2、再哪儿可以设置每个线程运行的时间?是固定为一个时间片还是可以设置为n个时间片?
3、修改HZ的值,为什么对线程的运行时间没有改变啊?

新手上路,请高手赐教!

pl:一个还没有解决的问题
在线程属性设置代码如下:
          /*线程属性设置*/
pthread_attr_init(&attr);
/*pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);*/
pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
pthread_attr_setschedpolicy(&attr,SCHED_RR);
pthread_attr_getschedparam(&attr,  &param);
printf("schedparam :%d\n",param.sched_priority);
param.sched_priority=30;
pthread_attr_setschedparam(&attr,  &param);

有点不明白的就是倒数第二句“param.sched_priority=30;”,如果加上这句,后面的六个线程,终端只显示打印第一个线程中的信息,并且还不能被中断;如果去掉这一句,后面六个线程中的信息轮询被打印出来。
同时恳请大虾们指正!

谢谢!

9 个解决方案

#1


没人回啊,自己顶上来!

#2


线程不好弄,就是不容易彻底弄清楚。能在实际应用中解决问题就行了,有时不一定是线程的执行时间的问题。

#3


线程的时间片不可控吗?这个是最大的一个问题。

#4


线程的时间片应该是不可控的吧~
线程之间是竞争cpu资源的~

#5


引用 4 楼 liycool 的回复:
线程的时间片应该是不可控的吧~ 
线程之间是竞争cpu资源的~
对!用得到线程的,当然许多工作会是同时进行,而各工作之间的联系,一般是不能准确地控制。我说得对不对?3楼的。

#6


2.4的内核时间片大概是20ms,用示波器测信号硬件需要一部分时间,所以要100ms
因为最小是20,你改那个没用应该,你可以试试改大
20ms我是这样得出来的:
for ( i = 0 ; i < n ; i ++ )
    usleep(1);

当n很大时, usleep(1)近似等于usleep(20);

2.6内核是抢占式的,不再平均分配时间片,也就是说有点线程时间片长,有的短,
而且最小响应时间据说提高了10倍

#7


近似等于usleep(20000); 

#8


2.4?2.6?是指主频么?6楼能否解释下

#9


lz使用的内核是2.4还是2.6?
2.6采用的是时间复杂度为O(1)的调度策略,线程的调度策略有三种可设的方法:

  非实时
  1) SCHED_OTHER 
  实时
  2) SCHED_FIFO   
  3) SCHED_RR   


看看这个 
 http://www.linuxdriver.cn/html/200712/387.htm
 

#1


没人回啊,自己顶上来!

#2


线程不好弄,就是不容易彻底弄清楚。能在实际应用中解决问题就行了,有时不一定是线程的执行时间的问题。

#3


线程的时间片不可控吗?这个是最大的一个问题。

#4


线程的时间片应该是不可控的吧~
线程之间是竞争cpu资源的~

#5


引用 4 楼 liycool 的回复:
线程的时间片应该是不可控的吧~ 
线程之间是竞争cpu资源的~
对!用得到线程的,当然许多工作会是同时进行,而各工作之间的联系,一般是不能准确地控制。我说得对不对?3楼的。

#6


2.4的内核时间片大概是20ms,用示波器测信号硬件需要一部分时间,所以要100ms
因为最小是20,你改那个没用应该,你可以试试改大
20ms我是这样得出来的:
for ( i = 0 ; i < n ; i ++ )
    usleep(1);

当n很大时, usleep(1)近似等于usleep(20);

2.6内核是抢占式的,不再平均分配时间片,也就是说有点线程时间片长,有的短,
而且最小响应时间据说提高了10倍

#7


近似等于usleep(20000); 

#8


2.4?2.6?是指主频么?6楼能否解释下

#9


lz使用的内核是2.4还是2.6?
2.6采用的是时间复杂度为O(1)的调度策略,线程的调度策略有三种可设的方法:

  非实时
  1) SCHED_OTHER 
  实时
  2) SCHED_FIFO   
  3) SCHED_RR   


看看这个 
 http://www.linuxdriver.cn/html/200712/387.htm