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

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>
            亚洲欧美日韩精品在线| 久久久久久久综合色一本| 99www免费人成精品| 国内精品**久久毛片app| 国产精品一卡| 国产精品美女一区二区| 国产精品久久久久久模特 | 久久久久久久综合| 久久精品一二三| 久久久免费精品视频| 久久性色av| 欧美国产先锋| 国产精品成人久久久久| 国产免费成人av| 曰韩精品一区二区| 亚洲精品一区二区网址 | 国产精品久久9| 国产精品一区二区三区久久久| 国产视频久久| 在线精品观看| 99国产精品国产精品久久| 亚洲一区二区三区精品视频| 午夜精品在线观看| 蜜桃av久久久亚洲精品| 欧美激情亚洲一区| 亚洲午夜高清视频| 久久久久一区| 亚洲无限乱码一二三四麻| 欧美精品福利| 国产精品一区二区久久| 1000部国产精品成人观看| 一本色道久久加勒比精品| 校园春色综合网| 欧美成人dvd在线视频| 99精品视频免费全部在线| 午夜精品在线视频| 欧美精品一区二区三区久久久竹菊| 欧美午夜精品久久久久免费视| 国产一区二区三区久久精品| 亚洲激情第一页| 亚洲欧美国产精品桃花| 嫩草国产精品入口| 亚洲制服欧美中文字幕中文字幕| 久久久久久久久久久久久女国产乱| 欧美日韩精品三区| 樱桃视频在线观看一区| 亚洲欧洲99久久| 亚洲高清一二三区| 亚洲第一综合天堂另类专| 免费观看30秒视频久久| 免费h精品视频在线播放| 99re国产精品| 99re8这里有精品热视频免费| 亚洲欧美精品一区| 亚洲国产精品久久久久婷婷884| 亚洲免费在线| 欧美三区在线观看| 亚洲精品小视频| 欧美激情一区二区三区蜜桃视频| 性娇小13――14欧美| 国产精品任我爽爆在线播放| 一区二区三区日韩欧美精品| 亚洲国产精品久久久久秋霞不卡| 美女啪啪无遮挡免费久久网站| 国际精品欧美精品| 久久久久99精品国产片| 久久成人免费网| 国产一区二区三区在线观看免费视频 | 这里只有精品在线播放| 欧美丰满高潮xxxx喷水动漫| 久久精品九九| 韩国福利一区| 蜜桃久久精品一区二区| 久久精品国产第一区二区三区最新章节| 国产麻豆成人精品| 欧美在线网站| 美女精品在线| 欧美暴力喷水在线| 亚洲国产精品一区二区尤物区| 久久午夜电影| 久久欧美中文字幕| 91久久嫩草影院一区二区| 亚洲大胆在线| 欧美国产日本韩| 99视频超级精品| 日韩小视频在线观看专区| 欧美日韩高清在线| 亚洲淫性视频| 亚洲婷婷在线| 国产日韩欧美| 欧美 日韩 国产在线 | 欧美日韩国产在线播放| 一区二区三区免费观看| 一区二区三区免费看| 国产精品h在线观看| 午夜欧美精品| 久久午夜电影| 亚洲深夜激情| 欧美一级日韩一级| 最新亚洲视频| 亚洲精品一区二区三区樱花| 欧美视频一区二区三区四区| 久久成人精品视频| 蜜乳av另类精品一区二区| 亚洲天堂成人在线观看| 欧美在线视频不卡| 日韩亚洲精品视频| 午夜在线精品| 亚洲肉体裸体xxxx137| 在线亚洲一区| 亚洲国产一区二区三区在线播| 在线中文字幕一区| 亚洲成色精品| 亚洲综合国产精品| 亚洲黄色一区| 亚洲欧美日韩国产| 亚洲精品国产系列| 亚洲欧美国产精品va在线观看| 亚洲激情精品| 亚洲永久免费| 99视频精品在线| 久久国产高清| 午夜精品理论片| 欧美人在线视频| 美国十次成人| 国产三区精品| 一区二区三区高清不卡| 在线成人www免费观看视频| 在线亚洲+欧美+日本专区| 亚洲日本中文字幕| 久久躁日日躁aaaaxxxx| 欧美专区第一页| 国产精品成人免费精品自在线观看| 欧美成年人视频| 一色屋精品视频免费看| 欧美一二三区精品| 性欧美xxxx大乳国产app| 欧美日韩精品二区| 亚洲精品一区二区三区四区高清 | 最近中文字幕日韩精品| 国产精品制服诱惑| 亚洲美女毛片| 一区二区久久久久| 欧美激情精品久久久六区热门 | 校园激情久久| 欧美日韩精品一区二区在线播放 | 亚洲欧洲综合| 亚洲国产日韩欧美| 免费成人在线视频网站| 欧美激情一区二区久久久| 在线电影一区| 欧美成年人视频网站| 亚洲国产美女| 亚洲国产91精品在线观看| 久久综合久久久久88| 欧美xxx成人| 91久久精品日日躁夜夜躁国产| 欧美成人免费大片| 亚洲日本aⅴ片在线观看香蕉| 99伊人成综合| 欧美午夜视频| 午夜精品久久久久久久久| 久久久人成影片一区二区三区观看 | 午夜精品免费视频| 国产精品视频在线观看| 香蕉成人啪国产精品视频综合网| 欧美国产日韩精品免费观看| 欧美激情在线播放| 日韩午夜电影av| 国产精品爱久久久久久久| 亚洲欧美在线一区二区| 欧美11—12娇小xxxx| 亚洲精品一区二区网址| 欧美日韩视频| 亚洲欧美在线看| 欧美成人免费全部| 亚洲资源av| 亚洲高清不卡一区| 欧美日韩精品一区二区在线播放 | 国产日韩精品一区| 久久精品视频播放| 亚洲精品一区在线观看| 久久激情久久| 日韩视频一区二区三区| 欧美一区二区私人影院日本| 欧美日韩国产专区| 国产精品尤物| 久久在线免费观看视频| 欧美一区二区在线免费播放| 亚洲国产精品精华液2区45| 亚洲高清在线观看| 国产精品国产一区二区| 欧美成人r级一区二区三区| 国产精品99一区| 日韩一二在线观看| 亚洲精品少妇30p| 麻豆成人在线| 猫咪成人在线观看| 激情久久一区| 老司机一区二区|