Linux下的高精度時間獲得與定時器

2021-05-24 22:32:05 字數 2341 閱讀 7528

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

在linux下通常可用的精度最高的時間介面是gettimeofday,它返回乙個timeval結構,其精度為us,即10-6 秒,大多數情況這個精度已經夠用了。不過有時為了更高的精度,比如納秒級的時間精度,我們需求探索linux為我們提供的時間呼叫。

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

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

long clock_gettime(clockid_t ,struct timespec*)

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

clock_realtime                            系統當前時間,從2023年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*)

設定特定時鐘的時間

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

休眠time中指定的時間,如果遇到訊號中斷而提前返回,則由left_time返回剩餘的時間。

有了這些個時間函式之後,我們再來看下如何實現一些不同精度的簡單的定時器。

最粗糙的定時器可以由sleep來實現,其精度為秒級,系統也提供像nanosleep,usleep,ualarm等,當然你願意也可以由poll(ms)、select(us)、ppoll或pslect(ns)等來實現各種精度的sleep。通過這些高精度的sleep函式,也可以實現一系統不同精度的定時器。

下面我們將探索一下由作業系統提供的一些定時器機制。作業系統提供了兩個種類的定時器,一種是顯式的定時器,另一種是隱藏在呼叫的超時時間或特定檔案屬性之上。後者我們在前面已經見到過,比如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族的定時器到系統顯式的定時器,各有優缺點,使用時根據情況權衡選擇。

php 高精度函式,php生成高精度時間的例子

如果需要使用高於秒的計量精度的時間,例如,要生成乙個唯一的id或者乙個函式呼叫的基準。使用microtime true 來以秒和微秒計量當前的時間。下面的例子使用了microtime true 來計算要完成1000個正規表示式匹配需要多長時間。例1 用microtime 來計時。複製 如下 star...

關於Linux下的高精度定時器

作業系統的預設定時器的精度是很低的,比如在windows下呼叫sleep 20 延時20毫秒,實際上80毫秒都可能。做 伺服器,免不了需要高精度的定時器,比如語音會議,需要很精確地每20毫秒進行一次混音並通過rtp傳送。我們的 庫原來只在windows下實現,使用了windows寫的高效能定時器的一...

linux下獲取微秒級精度的時間

使用c語言在linux環境下獲得微秒級時間 1 資料結構 int gettimeofday struct timeval tv,struct timezone tz 其引數tv是儲存獲取時間結果的結構體,引數tz用於儲存時區結果 struct timezone timezone 引數若不使用則傳入n...