LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: chairman

如何让一个线程休眠?单位是us

[复制链接]
发表于 2006-4-11 22:16:34 | 显示全部楼层
Post by gamedragon
但是操作系统调度进程可不是用CPU里的计数器来实现的。

那你以为,系统是怎样获得时间的
回复 支持 反对

使用道具 举报

发表于 2006-4-11 22:24:58 | 显示全部楼层
Post by chairman
用sleep确实是可以的。因为现在的LINUX用的NPTL之后是1:1的调度。但是如果把sleep换成usleep,或者select休眠us级别的话,明显发现就不对。usleep和select的返回都太慢了。应该是10ms级别的。我说的这种是情况是在多线程的情况下,让两个线程一个select 10us然后打印一条语句,一个select 20us然后打印。发现打印的很慢,更本不是us级别的

你可以试一下,先gettimeofday,usleep 20us,再gettimeofday,把两者的差值打出来看看是多少!
靠感觉是出不来的
回复 支持 反对

使用道具 举报

发表于 2006-4-12 09:07:17 | 显示全部楼层
Intel架构的PC是用像8253这种计时器去产生时钟中断(精度应该在ms级),依靠这个中断去进行计时和进程调度的。而且具体的进程调度不是在中断处理程序里,而是放到bottom-half里面去处理,至少非实时系统是这样。因此其响应的实时程度有限的很。
CPU里的那个计数器好像一般是用来精确统计程序运行效率的时候才用得上,那个计数器又不会产生中断,对普通操作系统的调度来说应该作用不大。
印象中好像也没有哪个实时系统能达到微秒级的响应速度吧。
回复 支持 反对

使用道具 举报

发表于 2006-4-12 09:15:27 | 显示全部楼层
内核编译时有一个选项即时钟频率,可选100HZ(10ms), 250HZ(4ms), 1000HZ(1ms)
这是内核态的最小定时精度(忙等待不算)
用户态因为还有调度的问题,精度更低
回复 支持 反对

使用道具 举报

发表于 2006-4-12 12:10:29 | 显示全部楼层
Post by chairman
用sleep确实是可以的。因为现在的LINUX用的NPTL之后是1:1的调度。但是如果把sleep换成usleep,或者select休眠us级别的话,明显发现就不对。usleep和select的返回都太慢了。应该是10ms级别的

我们说的好像不是一回事,我说的是sleep不能睡眠单个线程而是睡眠整个进程,你说的是睡眠的时间精度
回复 支持 反对

使用道具 举报

发表于 2006-4-12 19:01:31 | 显示全部楼层
呵呵!我试了一下,在我的机器上,usleep (20)耗时大概在10ms到20ms之间。而直接两个gettimeofday的话,耗时5us左右。这样看来,usleep可能也是会调度的。没找到usleep是怎样实现的,可是我觉得这么短的时间还要去切换进程根本就是得不偿失的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-13 10:03:16 | 显示全部楼层
Post by haohao_h
呵呵!我试了一下,在我的机器上,usleep (20)耗时大概在10ms到20ms之间。而直接两个gettimeofday的话,耗时5us左右。这样看来,usleep可能也是会调度的。没找到usleep是怎样实现的,可是我觉得这么短的时间还要去切换进程根本就是得不偿失的。
呵呵,和我试的结果是一样的。Linux在X86上调度的时候是用10ms为一个基本单位,所以我想usleep可能也只能到达10ms级别。而gettimeofday是直接读内核中的xtimer(好像是这个变量)这个值。这个变量是在系统时钟发生硬中断的时候发生改变,所以应该能到us级别。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-13 10:04:38 | 显示全部楼层
Post by Arthur.Echo
我们说的好像不是一回事,我说的是sleep不能睡眠单个线程而是睡眠整个进程,你说的是睡眠的时间精度
我明白你的意思。sleep可以睡眠单个线程而不睡眠整个进程。因为Linux的内核调度的单位是线程不是进程
回复 支持 反对

使用道具 举报

发表于 2006-4-13 12:40:02 | 显示全部楼层
Post by chairman
我明白你的意思。sleep可以睡眠单个线程而不睡眠整个进程。因为Linux的内核调度的单位是线程不是进程

今天又试了一下,确实可以,看来上次大意了,抱歉,不过man里的确是说的是睡眠一个进程。
上次试的时候是在一个大程序里边,估计是其他的地方影响了结果,今天弄了个小的来试sleep,确实可以睡眠单个线程,再次抱歉
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <unistd.h>

  4. void *
  5. my_thread()
  6. {
  7.    printf("Start another thread!\n");

  8.    sleep(60);
  9.    
  10.    printf("Sleeped thread wake up!\n");

  11.    return;
  12. }

  13. int main()
  14. {
  15.    int thread_id;
  16.    pthread_t p_thread;
  17.   
  18.    thread_id = pthread_create(&p_thread,NULL,my_thread,NULL);

  19.    printf("This is the master thread!\n");
  20.    sleep(10);
  21.    printf("The master thread wake up!\n");
  22.    
  23.    pthread_join(p_thread,NULL);

  24.    return 0;
  25. }   
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-6-9 11:21:28 | 显示全部楼层
用实时linux试试, 比如RedHawk Linux或者SuSE CRTE
www.ccur.com.cn


Post by haohao_h
这个你就不要想了,linux并不是实时系统,我想就是vxworks也做不到在1us内就响应吧!
但我觉得你所说的理由应该不成立,us级的延时进程是不会被调度的,虽然我没看过usleep是怎么实现的!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表