高精度計時器,windows,linux,voworks

本文主要介紹Linux下高精度時間函數,及相關的具備超時機制的函數,對定時器也進行簡單的介紹。linux

在linux下一般可用的精度最高的時間接口是gettimeofday,它返回一個timeval結構,其精度爲us,即10-6 秒,大多數狀況這個精度已經夠用了。不過有時爲了更高的精度,好比納秒級的時間精度,咱們需求探索Linux爲咱們提供的時間調用。編程

首先介紹struct timespec結構,這個結構體有兩個成員,一個是秒,一個是納秒。函數

在librt庫中,提供了高精度的時間函數,分別是:工具

long clock_gettime(clockid_t ,struct timespec*)編碼

獲取特定時鐘的時間,時間經過fp結構傳回,目前定義了6種時鐘,分別是操作系統

CLOCK_REALTIME               系統當前時間,從1970年1.1日算起線程

CLOCK_MONOTONIC              系統的啓動時間,不能被設置繼承

CLOCK_PROCESS_CPUTIME_ID     進程運行時間接口

CLOCK_THREAD_CPUTIME_ID      線程運行時間進程

CLOCK_REALTIME_HR            CLOCK_REALTIME的高精度版本

CLOCK_MONOTONIC_HR           CLOCK_MONOTONIC的高精度版本

獲取特定時鐘的時間精度:

long clock_getres(clockid_t )

設置特定時鐘的時間:

long clock_settime(clockid_t ,struct timespec*)

休眠time中指定的時間,若是遇到信號中斷而提早返回,則由left_time返回剩餘的時間:

long clock_nanosleep(clockid_t ,int flag,timespec* time,timespec* left_time)

有了這些個時間函數以後,咱們再來看下如何實現一些不一樣精度的簡單的定時器。

最粗糙的定時器能夠由sleep來實現,其精度爲秒級,系統也提供像nanosleep,usleep,ualarm等,固然你願意也能夠由poll(ms)、select(us)、ppoll或pslect(ns)等來實現各類精度的sleep。經過這些高精度的sleep函數,也能夠實現一系統不一樣精度的定時器。

經過上述sleep實現的定時器一般須要咱們自行進行編碼,並且過多的sleep也會致使某個cpu不能充分的利用,對於大量定時器的場合就須要當心編寫代碼,這種方式一般以單獨線程控制或主循環輪詢的方式查看哪些定時器到期。整體來講,實現複雜,效率較低,並且也沒有一種好的定時器到期時的通知機制,一般是被動由定時器線程強行執行或者自身線程在線程主循環中檢查到期的定時器並執行。

下面咱們將探索一下由操做系統提供的一些定時器機制。操做系統提供了兩個種類的定時器,一種是顯式的定時器,另外一種是隱藏在調用的超時時間或特定文件屬性之上。後者咱們在前面已經見到過,好比select、套接字描述符的超時屬性,這些須要在不一樣的編程領域去積累,固然它們也有各自的精度。下面咱們主要介紹一下系統提供的顯式的定時器。

Linux系統爲每一個進程提供了三個間隔定時器,精度爲us。定時器到期時將觸發相應的信號,定時器可能會從新開始,值得注意的是,fork生成的子進程並不繼承父進程的定時器。

int getitimer(int type, itimerval* val)

int setitimer(int type, itimerval* nval, itimerval* oval)

itimerval 有兩個成員,it_interval和it_value,均爲timeval類型,前者保存的是下次定時器的定時間隔,後者爲本次超時時的定時間隔。也就是說,定時器將從it_value減小,當變爲0時,發送信號,並從it_interval取值,從新開始定時器。若是val被置爲0,則中止定時器。

getitimer()用於設置一個定時器,而setitimer用於修改已經設置的定時器,若是在設置時定時器還沒有超時,則剩餘時間保存於oval。

定時器定時器三個定時器分別是:

ITIMER_REAL                以系統時間遞減,超時時投遞SIGALRM信號

ITIMER_VIRTUAL             以進程執行時間遞減,超時時投遞

SIGVTALRM ITIMER_PROF      當進程執行或進程執行系統調用時均遞減,超時時投遞SIGPROF信號。

此外Posix1.b中爲咱們提供了實時高精度的定時工具,精度能夠達到納秒。不過每一個進程只能有一個。

int timer_creat()

int timer_delete()

int timer_gettime()

int timer_settime()

具體使用方法不在這裏詳述,可見系統提供的定時器是一種珍惜資源,一般只是一種最基本的設施,應用須要使用這個最基本的設施定義多樣化的定時器,以知足程序中使用多種及多個定時器。固然系統提供的定時器須要人工設置信號處理等相關工做,須要專門處理信號的代碼,這個在必定程度上增長了程序的複雜性。所以說來,從sleep族的定時器到系統顯式的定時器,各有優缺點,使用時根據狀況權衡選擇。

相關文章
相關標籤/搜索