timerfd使用總結

timerfd是Linux爲用戶程序提供的一個定時器接口。這個接口基於文件描述符,通過文件描述符的可讀事件進行超時通知,所以能夠被用於select/poll的應用場景。timerfd是linux內核2.6.25版本中加入的藉口。
timerfd、eventfd、signalfd配合epoll使用,可以構造出一個零輪詢的程序,但程序沒有處理的事件時,程序是被阻塞的。這樣的話在某些移動設備上程序更省電。

clock_gettime函數可以獲取系統時鐘,精確到納秒。需要在編譯時指定庫:-lrt。可以獲取兩種類型事件:
CLOCK_REALTIME:相對時間,從1970.1.1到目前的時間。更改系統時間會更改獲取的值。也就是,它以系統時間爲座標。
CLOCK_MONOTONIC:與CLOCK_REALTIME相反,它是以絕對時間爲準,獲取的時間爲系統重啓到現在的時間,更改系統時間對齊沒有影響。

timerfd_create:
生成一個定時器對象,返回與之關聯的文件描述符。接收兩個入參,一個是clockid,填寫CLOCK_REALTIME或者CLOCK_MONOTONIC,參數意義同上。第二個可以傳遞控制標誌:TFD_NONBLOCK(非阻塞),TFD_CLOEXEC(同O_CLOEXEC)

注:timerfd的進度要比usleep要高。

timerfd_settime:能夠啓動和停止定時器;可以設置第二個參數:flags,0表示是相對定時器,TFD_TIMER_ABSTIME表示是絕對定時器。
第三個參數設置超時時間,如果爲0則表示停止定時器。定時器設置超時方法:
1、設置超時時間是需要調用clock_gettime獲取當前時間,如果是絕對定時器,那麼需要獲取CLOCK_REALTIME,在加上要超時的時間。如果是相對定時器,要獲取CLOCK_MONOTONIC時間。
2、數據結構: 
   struct timespec {
               time_t tv_sec;                /* Seconds */
               long   tv_nsec;               /* Nanoseconds */
           };

           struct itimerspec {
               struct timespec it_interval;  /* Interval for periodic timer */
               struct timespec it_value;     /* Initial expiration */
           };
      it_value是首次超時時間,需要填寫從clock_gettime獲取的時間,並加上要超時的時間。 it_interval是後續週期性超時時間,是多少時間就填寫多少。
     注意一個容易犯錯的地方:tv_nsec加上去後一定要判斷是否超出1000000000(如果超過要秒加一),否則會設置失敗。
     
     it_interval不爲0則表示是週期性定時器。
     it_value和it_interval都爲0表示停止定時器。

注:timerfd_create第一個參數和clock_gettime的第一個參數都是CLOCK_REALTIME或者CLOCK_MONOTONIC,timerfd_settime的第二個參數爲0(相對定時器)或者TFD_TIMER_ABSTIME,三者的關係:
1、如果timerfd_settime設置爲TFD_TIMER_ABSTIME(決定時間),則後面的時間必須用clock_gettime來獲取,獲取時設置CLOCK_REALTIME還是CLOCK_MONOTONIC取決於timerfd_create設置的值。
2、如果timerfd_settime設置爲0(相對定時器),則後面的時間必須用相對時間,就是:
    new_value.it_value.tv_nsec = 500000000;
    new_value.it_value.tv_sec = 3;
    new_value.it_interval.tv_sec = 0;
    new_value.it_interval.tv_nsec = 10000000;

read函數可以讀timerfd,讀的內容爲uint_64,表示超時次數。

timerfd簡單的性能測試:
申請1000個定時器,超時間定位1s,每秒超時一次,發現cpu佔用率在3.0G的cpu上大概爲1%,10000個定時器的話再7%左右,而且不會出現同時超時兩個的情況,如果有printf到前臺,則一般會出現定時器超時多次(3-5)纔回調。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章