日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机中的时间

發布時間:2025/3/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机中的时间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面:時鐘可以說是計算機的心臟,它是分時系統的基礎。如果時鐘反應到應用程序的層面,就是時間,很多應用程序都會涉及到時間處理。本文就來討論一下計算機中的時鐘與時間。

1、操作系統中的時間
在Unix/Linux系統中,有兩個不同的時間:日歷時間和進程時間。
(1)日歷時間:
有些書上又叫系統時間。該值是自1970年1月1日00:00:00以來國際標準時間(U T C)所經過的秒數累計值(早期的手冊稱U T C為格林尼治標準時間)。在PC/AT微機系統中,支撐該時間的硬件是實時鐘RT(Real Time)電路。操作系統在系統初始化的過程中,會從該電路中讀取該時間,并保存在內核變量中。
來看看Linux1.0中相關的代碼

//kernel/time.c
extern?long?kernel_mktime(struct?mktime?*?time);
//初始化時間
void?time_init(void)
{
????
struct?mktime?time;
????
int?i;

????
/*?checking?for?Update-In-Progress?could?be?done?more?elegantly
?????*?(using?the?"update?finished"-interrupt?for?example),?but?that
?????*?would?require?excessive?testing.?promise?I'll?do?that?when?I?find
?????*?the?time.????????????-?Torsten
?????
*/
????
/*?read?RTC?exactly?on?falling?edge?of?update?flag?*/
????
for?(i?=?0?;?i?<?1000000?;?i++)????/*?may?take?up?to?1?second?*/
????????
if?(CMOS_READ(RTC_FREQ_SELECT)?&?RTC_UIP)
????????????
break;
????
for?(i?=?0?;?i?<?1000000?;?i++)????/*?must?try?at?least?2.228?ms*/
????????
if?(!(CMOS_READ(RTC_FREQ_SELECT)?&?RTC_UIP))
????????????
break;
????
do?{?/*?Isn't?this?overkill???UIP?above?should?guarantee?consistency?*/
????????time.sec?
=?CMOS_READ(RTC_SECONDS);
????????time.min?
=?CMOS_READ(RTC_MINUTES);
????????time.hour?
=?CMOS_READ(RTC_HOURS);
????????time.day?
=?CMOS_READ(RTC_DAY_OF_MONTH);
????????time.mon?
=?CMOS_READ(RTC_MONTH);
????????time.year?
=?CMOS_READ(RTC_YEAR);
????}?
while?(time.sec?!=?CMOS_READ(RTC_SECONDS));
????
if?(!(CMOS_READ(RTC_CONTROL)?&?RTC_DM_BINARY)?||?RTC_ALWAYS_BCD)
??????{
????????BCD_TO_BIN(time.sec);
????????BCD_TO_BIN(time.min);
????????BCD_TO_BIN(time.hour);
????????BCD_TO_BIN(time.day);
????????BCD_TO_BIN(time.mon);
????????BCD_TO_BIN(time.year);
??????}
????time.mon
--;
????xtime.tv_sec?
=?kernel_mktime(&time);
}


//kernel/sched.c
//保存系統時間的內核變量
volatile?struct?timeval?xtime;????????/*?The?current?time?*/

//linux/mktime.h
struct?mktime?{
????
int?sec;??//
????int?min;??//分鐘
????int?hour;??//小時
????int?day;???//
????int?mon;??//
????int?year;??//
};
//kernel/mktime.c
//計算1970年1月1日00:00:00以來秒的累計值
long?kernel_mktime(struct?mktime?*?time)
{
????
long?res;
????
int?year;

????year?
=?time->year?-?70;
/*?magic?offsets?(y+1)?needed?to?get?leapyears?right.*/
????res?
=?YEAR*year?+?DAY*((year+1)/4);
????res?
+=?month[time->mon];
/*?and?(y+2)?here.?If?it?wasn't?a?leap-year,?we?have?to?adjust?*/
????
if?(time->mon>1?&&?((year+2)%4))
????????res?
-=?DAY;
????res?
+=?DAY*(time->day-1);
????res?
+=?HOUR*time->hour;
????res?
+=?MINUTE*time->min;
????res?
+=?time->sec;
????
return?res;
}

//linux/time.h
struct?timeval?{
????
long????tv_sec;????????/*?seconds?*/
????
long????tv_usec;????/*?microseconds?*/
};

(2)進程時間
該時間用來度量進程使用CPU的時間。
來看看Linux 1.0中相應的代碼:

//linux/sched.h
//內核任務的結構定義
struct?task_struct{
//
//依次為:用戶CPU時間,系統CPU時間,子進程用戶CPU時間,子進程系統CPU時間,
//進程開始運行時間
long?utime,stime,cutime,cstime,start_time;?
//
}

?當度量一個進程的執行時間時,Unix系統使用三個進程時間值:
? 時鐘時間。
? 用戶C P U時間。
? 系統C P U時間。
要取得任一進程的時鐘時間、用戶時間和系統時間很容易——只要執行命令 t i m e ( 1 ),其參數是要度量其執行時間的命令,例如:
$ cd /usr/include
$ time grep _POSIX_SOURCE */*.h > /dev/null
real?? 0m19.81s
user?? 0m0.43s
sys??? 0m4.53s
t i m e命令的輸出格式與所使用的s h e l l有關。

該時間的支撐硬件在PC機中是可編程定時芯片Intel8253(8254)。8254芯片的時鐘輸入頻率是1193180,我們通過設定一定的初始計數值(LATCH),默認值為65535,就能控制該芯片的輸出頻率,默認為1193180/65535hz,例如,假定LATCH=1193180/100,我們就能保證輸出頻率為100hz,即周期為10ms,我們稱為系統的時鐘周期,或者1個系統滴答。這樣,1個系統的滴答就為10ms,這也Linux的默認值。
8254芯片每經過一個滴答時間,就會向CPU發出一個時鐘中斷。Linux會在時鐘中斷處理過程增加內核變量jiffies值,該值累計系統開機以來的經過的時鐘滴答數。

Linux 1.0中的代碼:

//kernel/sched.c
unsigned?long?volatile?jiffies=0;?//累計系統開機以來的滴答數

2、標準C庫中的時間函數

typedef?long?int?__clock_t;????/*?Type?of?CPU?usage?counts.??*/
typedef?
long?int?__time_t;


//time.h
typedef?__clock_t?clock_t;
#define?CLOCKS_PER_SEC??…
typedef?__time_t?time_t;

extern?clock_t?clock?__P?((void));
extern?time_t?time?__P?((time_t?*__timer));

?clock函數返回當前進程的使用處理器的時間的近似值,每秒的的時鐘滴答數用宏CLOCKS_PER_SEC定義。
在傳統的C語言中,clock函數返回的類型為long(如上),但返回值實際上為unsigned long類型,long是在C語言加入unsigned long之前使用的。計算處理器時間總是使用無符號數算術。一些非標準實現中使用times函數,而不是clock函數,其返回的結構化值報告處理器時間的各個成員,通常以1/60秒為單位。如下:

//sys/times.h
struct?tms
??{
????clock_t?tms_utime;????????
/*?User?CPU?time.??*/
????clock_t?tms_stime;????????
/*?System?CPU?time.??*/

????clock_t?tms_cutime;????????
/*?User?CPU?time?of?dead?children.??*/
????clock_t?tms_cstime;????????
/*?System?CPU?time?of?dead?children.??*/
??};


/*?Store?the?CPU?time?used?by?this?process?and?all?its
???dead?children?(and?their?dead?children)?in?BUFFER.
???Return?the?elapsed?real?time,?or?(clock_t)?-1?for?errors.
???All?times?are?in?CLK_TCKths?of?a?second.??
*/
extern?clock_t?times?__P?((struct?tms?*__buffer));

標準C中函數time返回當前的日歷時間,返回值類型為time_t。

/time.h
extern?char?*asctime?__P?((__const?struct?tm?*__tp));

/*?Equivalent?to?`asctime?(localtime?(timer))'.??*/
extern?char?*ctime?__P?((__const?time_t?*__timer));

?這兩個函數都返回時間的字符串的形式。

//time.h

/*?Return?the?`struct?tm'?representation?of?*TIMER
???in?Universal?Coordinated?Time?(aka?Greenwich?Mean?Time).??
*/
extern?struct?tm?*gmtime?__P?((__const?time_t?*__timer));

/*?Return?the?`struct?tm'?representation
???of?*TIMER?in?the?local?timezone.??
*/
extern?struct?tm?*localtime?__P?((__const?time_t?*__timer));

/*?Used?by?other?time?functions.??*/
struct?tm
{
??
int?tm_sec;????????????/*?Seconds.????[0-60]?(1?leap?second)?*/
??
int?tm_min;????????????/*?Minutes.????[0-59]?*/
??
int?tm_hour;????????????/*?Hours.????[0-23]?*/
??
int?tm_mday;????????????/*?Day.????????[1-31]?*/
??
int?tm_mon;????????????/*?Month.????[0-11]?*/
??
int?tm_year;????????????/*?Year????-?1900.??*/
??
int?tm_wday;????????????/*?Day?of?week.????[0-6]?*/
??
int?tm_yday;????????????/*?Days?in?year.[0-365]????*/
??
int?tm_isdst;????????????/*?DST.????????[-1/0/1]*/

#ifdef????__USE_BSD
??
long?int?tm_gmtoff;????????/*?Seconds?east?of?UTC.??*/
??__const?
char?*tm_zone;????/*?Timezone?abbreviation.??*/
#else
??
long?int?__tm_gmtoff;????????/*?Seconds?east?of?UTC.??*/
??__const?
char?*__tm_zone;????/*?Timezone?abbreviation.??*/
#endif
};

?gmtime與localtime將日歷時間轉換成stuct tm類型的分解形式,只不過前者轉換成GMT時間,而后者轉換成本地時間。

?

轉載于:https://www.cnblogs.com/hustcat/archive/2009/06/14/1503244.html

總結

以上是生活随笔為你收集整理的计算机中的时间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。