青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

關于短延遲 sleep usleep nanosleep select

Posted on 2008-08-21 19:19 Prayer 閱讀(17036) 評論(1)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX
udelay(unsigned long usecs);
mdelay(unsigned long msecs);

前者用軟件循環指定的微妙數,后者調用前者達到延遲毫秒級。udelay 函數只能用于獲取較短的時間延遲,因為loops_per_second值的精度只有8位,所以,當計算更長的延遲時會積累出相當大的誤差。盡管最大能允許的延遲將近1秒(因為更長的延遲就要溢出),推薦的 udelay 函數的參數的最大值是取1000微秒(1毫秒)。延遲大于 11 毫秒時可以使用函數 mdelay。
要特別注意的是 udelay 是個忙等待函數(所以 mdelay 也是),在延遲的時間段內無法運行其他的任務,因此要十分小心,尤其是 mdelay,除非別無他法,要盡量避免使用。
mdelay 在 Linux 2.0 中并不存在,頭文件 sysdep.h 彌補了這一缺陷。

關于
usleep sleep 主要的差距在精確程度上,不過網友有關于這個方面的精辟論斷:
同樣我覺得
select也是比較好的定時機制,不過大家可以看igmp-proxy的源代碼。主函數里面用setitimer和select同時定時是一個相當好的想法。

#################################################################
再論精確延時(usleep,nanosleep,select)

/*
        make: gcc -o test_sleep test_sleep.c
*/
/*        #include "comm_main.h" */
#include <stdio.h>;
#include <stdlib.h>;
#include <time.h>;
#include <sys/time.h>;
#include <errno.h>;
#include <string.h>;
#include <unistd.h>;
#include <sys/types.h>;

#define PRINT_USEAGE { \
   fprintf(stderr,"\n Usage: %s usec ",argv[0]); \
   fprintf(stderr,"\n\n");\
}

int
main (int argc, char **argv)
{
unsigned int nTimeTestSec = 0;        /* sec */
unsigned int nTimeTest = 0;        /* usec */
struct timeval tvBegin;
struct timeval tvNow;
int ret = 0;
unsigned int nDelay = 0;        /* usec */
fd_set rfds;
struct timeval tv;
int fd = 1;
int i = 0;
struct timespec req;
unsigned int delay[20] =
    { 500000, 100000, 50000, 10000, 1000, 900, 500, 100, 10, 1, 0 };
int nReduce = 0;                /* 誤差 */

#if 0
if (argc < 2)
    {
      PRINT_USEAGE;
      exit (1);
    }
nDelay = atoi (argv[1]);
#endif

fprintf (stderr, "%18s%12s%12s%12s\n", "function", "time(usec)", "realTime",
           "reduce");
fprintf (stderr,
           "-------------------------------------------------------------------\n");

for (i = 0; i < 20; i++)
    {
      if (delay[i] <= 0)
        break;
      nDelay = delay[i];

      /*      test usleep */
      gettimeofday (&tvBegin, NULL);
      ret = usleep (nDelay);
      if (-1 == ret)
        {
          fprintf (stderr, " usleep error . errno=%d [%s]\n", errno,
                   strerror (errno));
        }
      gettimeofday (&tvNow, NULL);
      nTimeTest =
        (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec -
        tvBegin.tv_usec;
      nReduce = nTimeTest - nDelay;
      fprintf (stderr, "\t usleep       %8u   %8u   %8d\n", nDelay, nTimeTest,nReduce);


      /*      test nanosleep */
      gettimeofday (&tvBegin, NULL);
      req.tv_sec = nDelay / 1000000;
      req.tv_nsec = (nDelay % 1000000) * 1000;
      ret = nanosleep (&req, NULL);
      if (-1 == ret)
        {
          fprintf (stderr, "\t nanosleep    %8u   not support\n", nDelay);
        }
      else
        {
          gettimeofday (&tvNow, NULL);
          nTimeTest =
            (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec -
            tvBegin.tv_usec;
          nReduce = nTimeTest - nDelay;
          fprintf (stderr, "\t nanosleep    %8u   %8u   %8d\n", nDelay,
                   nTimeTest, nReduce);
        }

      /*      test select */
      gettimeofday (&tvBegin, NULL);
      FD_ZERO (&rfds);
      FD_SET (fd, &rfds);
      tv.tv_sec = 0;
      tv.tv_usec = nDelay;
      ret = select (0, NULL, NULL, NULL, &tv);
      if (-1 == ret)
        {
          fprintf (stderr, " select error . errno=%d [%s]\n", errno,
                   strerror (errno));
        }
      gettimeofday (&tvNow, NULL);
      nTimeTest =
        (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec -
        tvBegin.tv_usec;
      nReduce = nTimeTest - nDelay;
      fprintf (stderr, "\t select       %8u   %8u   %8d\n", nDelay, nTimeTest,
               nReduce);

    }

return 0;
}

---------------------------------------------------------------------------------------------------------------------------------------------------

測試
IBM AIX 3.4 單CPU
        sleep 可以在多線程中使用,只阻塞本線程,不影響所屬進程中的其它線程
        不支持 nanosleep
        支持 usleep 和 select
        以下采用 gettimeofday 對 usleep 和 select 的實際精確情況進行測試分析
          function time(usec)    realTime      reduce
-------------------------------------------------------------------
         usleep         500000     500026         26
         nanosleep      500000   not support
         select         500000     500026         26
         usleep         100000     100021         21
         nanosleep      100000   not support
         select         100000     100025         25
         usleep          50000      50021         21
         nanosleep       50000   not support
         select          50000      50107        107
         usleep          10000      10099         99
         nanosleep       10000   not support
         select          10000      10025         25
         usleep           1000       1021         21
         nanosleep        1000   not support
         select           1000       1024         24
         usleep            900        920         20
         nanosleep         900   not support
         select            900       1024        124
         usleep            500        523         23
         nanosleep         500   not support
         select            500       1024        524
         usleep            100        119         19
         nanosleep         100   not support
         select            100       1023        923
         usleep             10         31         21
         nanosleep          10   not support
         select             10       1024       1014
         usleep              1         19         18
         nanosleep           1   not support
         select              1       1026       1025

       
    由此可以得出,在AIX 3.4下:
         select 只能精確到毫秒級別
         usleep 可以精確到微秒級
         在1毫秒以上,兩者的精確度基本一樣

同上,在 linux 2.4.20-8smp 雙CPU 下測試
          function time(usec)    realTime      reduce
-------------------------------------------------------------------
         usleep         500000     506453       6453
         nanosleep      500000     509930       9930
         select         500000     499990        -10
         usleep         100000     110023      10023
         nanosleep      100000     109955       9955
         select         100000      99992         -8
         usleep          50000      59971       9971
         nanosleep       50000      59990       9990
         select          50000      50025         25
         usleep          10000      19991       9991
         nanosleep       10000      19988       9988
         select          10000       9956        -44
         usleep           1000      19990      18990
         nanosleep        1000      19989      18989
         select           1000      10024       9024
         usleep            900      20009      19109
         nanosleep         900      19972      19072
         select            900       9943       9043
         usleep            500      19975      19475
         nanosleep         500      19971      19471
         select            500      10012       9512
         usleep            100      19975      19875
         nanosleep         100      19976      19876
         select            100       9943       9843
         usleep             10      19988      19978
         nanosleep          10      19961      19951
         select             10      10011      10001
         usleep              1      19978      19977
         nanosleep           1      19985      19984
         select              1       9932       9931
在 2.4.21-4.ELsmp #1 SMP 4 CPU 下測試
           function time(usec)    realTime      reduce
-------------------------------------------------------------------
         usleep         500000     501267       1267
         nanosleep      500000     509964       9964
         select         500000     499981        -19
         usleep         100000     109944       9944
         nanosleep      100000     109925       9925
         select         100000      99963        -37
         usleep          50000      59904       9904
         nanosleep       50000      59973       9973
         select          50000      49956        -44
         usleep          10000      19988       9988
         nanosleep       10000      20008      10008
         select          10000      10020         20
         usleep           1000      19988      18988
         nanosleep        1000      19980      18980
         select           1000       9943       8943
         usleep            900      19975      19075
         nanosleep         900      19986      19086
         select            900       9905       9005
         usleep            500      19989      19489
         nanosleep         500      19910      19410
         select            500      10000       9500
         usleep            100      19355      19255
         nanosleep         100      19902      19802
         select            100       9988       9888
         usleep             10      19977      19967
         nanosleep          10      19988      19978
         select             10       9943       9933
         usleep              1      20007      20006
         nanosleep           1      19947      19946
         select              1       9980       9979
        
由此可以得出如下結論,在 linux 2.4 下:
          1、支持 usleep,nanosleep,select
          2、select 的 精確度為 10毫秒。在10毫秒以上很精確
          3、usleep, nanosleep 很不精確

同樣,通過其它測試程序能得出如下結論:
          sleep 可以在多線程中使用,只阻塞本線程,不影響所屬進程中的其它線程

usleep()有有很大的問題

  1. 在一些平臺下不是線程安全,如HP-UX以及Linux
  2. usleep()會影響信號
  3. 在很多平臺,如HP-UX以及某些Linux下,當參數的值必須小于1 * 1000 * 1000也就是1秒,否則該函數會報錯,并且立即返回。
  4. 大部分平臺的幫助文檔已經明確說了,該函數是已經被舍棄的函數。

還好,POSIX規范中有一個很好用的函數,nanosleep(),該函數沒有usleep()的這些缺點,它的精度是納秒級。在Solaris的多線程環境下編譯器會自動把usleep()連接成nanosleep()。

Linux下短延時推薦使用select函數.

Feedback

# re: 關于短延遲 sleep usleep nanosleep select[未登錄]  回復  更多評論   

2012-07-16 09:17 by jim
感謝分享,很好
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品视频在线| 亚洲免费在线观看| 亚洲淫性视频| 尹人成人综合网| 欧美电影美腿模特1979在线看| 国产精品久久久久久久一区探花 | 中国亚洲黄色| 黄色国产精品一区二区三区| 久久久久久精| 六月婷婷久久| 亚洲另类视频| 国产精品推荐精品| 欧美专区在线播放| 女人香蕉久久**毛片精品| 亚洲人午夜精品免费| 欧美新色视频| 午夜精品成人在线| 亚洲经典在线| 亚洲国产美国国产综合一区二区| 亚洲欧美成aⅴ人在线观看| 亚洲欧美国产精品桃花| 在线观看欧美亚洲| 欧美连裤袜在线视频| 久久一区二区视频| 久久本道综合色狠狠五月| 久久精品盗摄| 亚洲欧美日韩中文视频| 欧美激情小视频| 久久久久久久一区二区| 亚洲香蕉在线观看| 久色成人在线| 久久久精品2019中文字幕神马| 尤物yw午夜国产精品视频明星| 欧美日韩一区二区三区在线看| 欧美成人一区二区| 久久国产精品网站| 亚洲欧洲日韩女同| 99精品欧美一区二区蜜桃免费| 国产婷婷97碰碰久久人人蜜臀| 国产精品日韩欧美一区二区| 国产精品视频免费| 欧美国产综合| 国产精品黄色在线观看| 国产欧美亚洲视频| 国产日韩欧美综合| 极品少妇一区二区| 亚洲人成亚洲人成在线观看| 午夜精品视频在线观看| 香蕉久久夜色精品国产| 91久久国产综合久久91精品网站| 欧美成年人视频| 亚洲欧洲在线观看| 一区二区三区视频在线播放| 亚洲一二三四久久| 久久久噜噜噜久噜久久| 国产精品地址| 亚洲国产清纯| 久久久爽爽爽美女图片| 亚洲欧洲免费视频| 中文av字幕一区| 欧美日韩激情小视频| 国产区精品在线观看| 亚洲第一精品电影| 久久久久久婷| 免播放器亚洲一区| 亚洲字幕在线观看| 欧美v亚洲v综合ⅴ国产v| 一区二区三区我不卡| 欧美成人免费在线| 这里只有精品视频在线| 欧美色播在线播放| 亚洲欧美日韩综合| 亚欧成人在线| 国产精品网站在线| 99精品久久久| 亚洲丝袜av一区| 黄网站免费久久| 老妇喷水一区二区三区| 亚洲视频一区| 欧美日韩一区免费| 亚洲青色在线| 麻豆av福利av久久av| 欧美日韩中文在线观看| 久久国产精品免费一区| 久久久久久亚洲精品杨幂换脸| 国产视频在线观看一区二区| 欧美不卡一卡二卡免费版| 麻豆精品传媒视频| 在线欧美不卡| 欧美成人综合一区| 欧美岛国激情| 亚洲国产高清一区二区三区| 欧美激情精品久久久久久黑人| av成人毛片| 久久久噜噜噜| 亚洲欧美电影在线观看| 国产手机视频精品| 亚洲精品一区二区三区99| 亚洲精选91| 久久在线播放| 欧美1区2区3区| 欧美色另类天堂2015| 亚洲午夜女主播在线直播| 久久人91精品久久久久久不卡| 亚洲国产精品成人va在线观看| 久久久欧美精品sm网站| 欧美一区二区在线免费观看| 亚洲视频一二三| 日韩视频免费| 国产亚洲精品高潮| 亚洲淫性视频| 久久精品国产第一区二区三区最新章节| 国产精品一区二区久久国产| 亚洲黄色大片| 亚洲精品看片| 国产亚洲一区二区精品| 久久国产欧美日韩精品| 亚洲一区美女视频在线观看免费| 亚洲午夜av电影| 午夜精品福利电影| 亚洲曰本av电影| 欧美成人免费全部| 久久久久欧美精品| 欧美视频二区| 亚洲国产精品成人久久综合一区| 国产精品一区二区在线| 9国产精品视频| 一本大道久久精品懂色aⅴ| 老司机精品视频网站| 久久久久九九视频| 国产精品亚洲一区二区三区在线| 99国产精品自拍| 日韩亚洲成人av在线| 久久综合国产精品| 另类天堂av| 曰本成人黄色| 久久夜色精品国产亚洲aⅴ| 久久久激情视频| 国语自产在线不卡| 久久se精品一区二区| 久久久久久久网| 激情欧美一区二区| 久久久人人人| 欧美韩日一区二区| 亚洲国产婷婷香蕉久久久久久99| 久久久久久久一区| 欧美激情五月| 一区二区三区导航| 国产精品久久久久久超碰| 亚洲无吗在线| 欧美中文字幕在线播放| 国产日韩一区二区| 久久久噜噜噜久噜久久| 欧美黄色视屏| 一本色道久久综合精品竹菊| 欧美日韩国产综合新一区| 99在线精品观看| 久久精品视频免费播放| 激情六月婷婷久久| 欧美成人官网二区| 一卡二卡3卡四卡高清精品视频 | 国产精品国产三级国产aⅴ入口| 日韩天天综合| 欧美制服丝袜第一页| 国产尤物精品| 欧美不卡视频| 亚洲一区二区三区国产| 久久久久一区二区| 亚洲乱码国产乱码精品精可以看| 欧美日韩日本视频| 欧美自拍偷拍| 亚洲免费不卡| 鲁鲁狠狠狠7777一区二区| 一区二区三区av| 永久免费精品影视网站| 欧美三区视频| 久久亚洲一区二区| 亚洲无玛一区| 亚洲欧洲一二三| 久久成人国产| 夜夜精品视频一区二区| 黄色av成人| 亚洲精品在线视频| 欧美在线免费观看亚洲| 日韩视频在线免费观看| 国产日韩专区在线| 欧美日韩国产一区二区三区地区| 欧美一级二级三级蜜桃| 亚洲毛片av在线| 免费久久精品视频| 久久成人一区| 亚洲尤物精选| 日韩视频在线免费观看| 狠狠色2019综合网| 国产精品欧美风情| 欧美日韩精品一区二区天天拍小说| 久久精品av麻豆的观看方式| 中文亚洲视频在线| 99视频超级精品| 亚洲三级免费电影|