自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

系統(tǒng) Linux
本文主要介紹了Linux系統(tǒng)下高精度時間函數(shù),及相關(guān)的具有超時機(jī)制的函數(shù),對定時器也進(jìn)行簡單的介紹。相信對于Linux初學(xué)者來說會有很大的幫助。

本文主要介紹Linux下高精度時間函數(shù),及相關(guān)的具有超時機(jī)制的函數(shù),對定時器也進(jìn)行簡單的介紹。

在linux下通??捎玫木茸罡叩臅r間接口是gettimeofday,它返回一個timeval結(jié)構(gòu),其精度為us,即10-6 秒,大多數(shù)情況這個精度已經(jīng)夠用了。不過有時為了更高的精度,比如納秒級的時間精度,我們需求探索Linux為我們提供的時間調(diào)用。

首先介紹struct timespec結(jié)構(gòu),這個結(jié)構(gòu)體有兩個成員,一個是秒,一個是納秒。

在librt庫中,提供了高精度的時間函數(shù),分別是:

long clock_gettime(clockid_t ,struct timespec*)

獲取特定時鐘的時間,時間通過fp結(jié)構(gòu)傳回,目前定義了6種時鐘,分別是

CLOCK_REALTIME               系統(tǒng)當(dāng)前時間,從1970年1.1日算起 
CLOCK_MONOTONIC              系統(tǒng)的啟動時間,不能被設(shè)置 
CLOCK_PROCESS_CPUTIME_ID     進(jìn)程運行時間 
CLOCK_THREAD_CPUTIME_ID      線程運行時間 
CLOCK_REALTIME_HR            CLOCK_REALTIME的高精度版本 
CLOCK_MONOTONIC_HR           CLOCK_MONOTONIC的高精度版本

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

long clock_getres(clockid_t )           

設(shè)置特定時鐘的時間:

long clock_settime(clockid_t ,struct timespec*)                   

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

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

有了這些個時間函數(shù)之后,我們再來看下如何實現(xiàn)一些不同精度的簡單的定時器。

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

通過上述sleep實現(xiàn)的定時器通常需要我們自行進(jìn)行編碼,而且過多的sleep也會導(dǎo)致某個cpu不能充分的利用,對于大量定時器的場合就需要小心編寫代碼,這種方式通常以單獨線程控制或主循環(huán)輪詢的方式查看哪些定時器到期??傮w來說,實現(xiàn)復(fù)雜,效率較低,而且也沒有一種好的定時器到期時的通知機(jī)制,通常是被動由定時器線程強(qiáng)行執(zhí)行或者自身線程在線程主循環(huán)中檢查到期的定時器并執(zhí)行。

下面我們將探索一下由操作系統(tǒng)提供的一些定時器機(jī)制。操作系統(tǒng)提供了兩個種類的定時器,一種是顯式的定時器,另一種是隱藏在調(diào)用的超時時間或特定文件屬性之上。后者我們在前面已經(jīng)見到過,比如select、套接字描述符的超時屬性,這些需要在不同的編程領(lǐng)域去積累,當(dāng)然它們也有各自的精度。下面我們主要介紹一下系統(tǒng)提供的顯式的定時器。

Linux系統(tǒng)為每個進(jìn)程提供了三個間隔定時器,精度為us。定時器到期時將觸發(fā)相應(yīng)的信號,定時器可能會重新開始,值得注意的是,fork生成的子進(jìn)程并不繼承父進(jìn)程的定時器。

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

itimerval 有兩個成員,it_interval和it_value,均為timeval類型,前者保存的是下次定時器的定時間隔,后者為本次超時時的定時間隔。也就是說,定時器將從it_value減少,當(dāng)變?yōu)?時,發(fā)送信號,并從it_interval取值,重新開始定時器。如果val被置為0,則停止定時器。

getitimer()用于設(shè)置一個定時器,而setitimer用于修改已經(jīng)設(shè)置的定時器,如果在設(shè)置時定時器尚未超時,則剩余時間保存于oval。

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

ITIMER_REAL                以系統(tǒng)時間遞減,超時時投遞SIGALRM信號 
ITIMER_VIRTUAL             以進(jìn)程執(zhí)行時間遞減,超時時投遞
SIGVTALRM ITIMER_PROF      當(dāng)進(jìn)程執(zhí)行或進(jìn)程執(zhí)行系統(tǒng)調(diào)用時均遞減,超時時投遞SIGPROF信號。

此外Posix1.b中為我們提供了實時高精度的定時工具,精度可以達(dá)到納秒。不過每個進(jìn)程只能有一個。

int timer_creat() 
int timer_delete() 
int timer_gettime() 
int timer_settime()

具體使用方法不在這里詳述,可見系統(tǒng)提供的定時器是一種珍惜資源,通常只是一種最基本的設(shè)施,應(yīng)用需要使用這個最基本的設(shè)施定義多樣化的定時器,以滿足程序中使用多種及多個定時器。當(dāng)然系統(tǒng)提供的定時器需要人工設(shè)置信號處理等相關(guān)工作,需要專門處理信號的代碼,這個在一定程度上增加了程序的復(fù)雜性。因此說來,從sleep族的定時器到系統(tǒng)顯式的定時器,各有優(yōu)缺點,使用時根據(jù)情況權(quán)衡選擇。

【編輯推薦】

  1. Linux文件分割與合并:split&cat
  2. Linux進(jìn)程與作業(yè)的區(qū)別及相關(guān)命令
  3. Linux下利用ext3grep恢復(fù)被刪除的文件
  4. Linux/Unix操作系統(tǒng)處于內(nèi)網(wǎng)的桌面控制
  5. Novell推出業(yè)界最長的企業(yè)級Linux支持項目
     
責(zé)任編輯:馮宇 來源: Linux社區(qū)
相關(guān)推薦

2009-11-11 10:14:10

linux定時器操作系統(tǒng)

2023-01-10 13:53:21

Linux定時器

2012-03-07 16:58:32

專利

2010-07-28 15:56:22

FlexTimer定時

2018-11-02 08:10:58

Linuxsystemd定時器

2021-08-16 13:26:49

Linuxx86 Linux

2021-08-11 10:10:26

Linux定時器數(shù)組

2021-08-03 14:33:53

cron定時器Linux命令

2022-11-02 11:40:16

Flowable定時器流程

2023-12-11 09:50:35

Linux定時器

2021-06-28 06:00:11

systemd定時器系統(tǒng)運維

2011-02-23 10:20:45

2009-04-12 08:51:50

Symbian諾基亞移動OS

2021-03-31 08:33:17

SysTick定時器SysTick定時器

2013-07-29 10:10:40

TCP協(xié)議TCP定時器TCP

2021-07-27 16:01:29

高并發(fā)定時器高性能

2021-08-26 06:29:47

STM32DWT數(shù)據(jù)觀察點觸發(fā)

2023-08-02 09:26:03

軟件定時器鴻蒙

2017-02-28 17:18:34

Linux驅(qū)動技術(shù)內(nèi)核定時器
點贊
收藏

51CTO技術(shù)棧公眾號