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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux进程创建时间,linux进程创建时间计算

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

歡迎訪問小站,閱讀此文http://www.yandong.org/archives/501

簡介

墻上時間,也就是距離1970年1月1日的時間,在linux kernel內部沒多大用處,對其的應用多在用戶空間。

本文的目的在于在kernel里面計算得到 進程創建的墻上時間

計算公式

xtime.tv_sec-(jiffies/HZ)+300+p->real_start_time.tv_sec

意思就是,當前的墻上時間(xtime)?減去系統啟動后的節拍(jiffies)/頻率(HZ)???這樣得到的是系統啟動的墻上時間,即距離1970.1.1的秒數,然后再加上進程結構體中?保存的距離系統啟動時間的秒數(p->real_start_time.tv_sec)。

下面分別解釋:

task_struct中的時間

p->real_start_time.tv_sec

其中的p是task_struct指針,指向的是進程創建距離系統啟動的時間.

task_struct中有兩個時間:start_time 和 real_start_time,其中后者包含睡眠時間。

下面是進程創建的部分源碼

do_posix_clock_monotonic_gettime(&p->start_time);p->real_start_time=p->start_time;monotonic_to_bootbased(&p->real_start_time);//真實啟動時間還須要加上總的睡眠時間

xtime介紹

摘自《深入理解linux內核》

所有的PC都包含一個叫實時時鐘(Renl Time Clock RTC)的時鐘,它是獨立于CPU和所有其他芯片的。

即使當PC唄切斷電源,RTC還繼續工作,因為它靠一個小電池或蓄電池供電。CMOS RAM和RTC被集成在一個芯片上。

Linux只用RTC來獲取時間和日期。不過對/dev/rtc設備文件操作,也允許對RTC編程。

內核利用 get_cmos_time函數從實時時鐘上讀取字1970.1.1(UTC)午夜以來經過的秒數。

xtime_lock順序所(seqlock)消除了對xtime變量同時訪問而可能發生的競爭條件,

對于2.6內核,其定義為(/include/linux/time.h)

externstructtimespec xtime;

對于3.5內核,其定義為(kernel/time/timekeeping.c)

structtimekeeper{...structtimespec xtime;...};staticstructtimekeeper timekeeper;

xtime的獲取

因為很難原子的訪問結構體中的兩個變量,所以kernel并不鼓勵直接訪問xtime變量,可以使用相關函數

//include/linux/time.hstructtimespec current_kernel_time(void);externvoiddo_gettimeofday(structtimeval*tv);

所以如果在module里面直接使用 xtime,是不行的。但是可以通過硬編碼的方式獲取

比如:

long*xtime_ptr=&xtime;或者long*xtimr_ptr=0xc0803980

其中的?0xc0803980這個值,是從System.map中獲得的,xtime是個全局符號,所有從sytem.map中可以獲得它的地址

root@hyd:/home/l# cat /boot/System.map-2.6 | grep xtimec0156230 T update_xtime_cache

c06e3c00 D xtime_lock

c072f654 D inet_peer_gc_maxtime

c0803980 B xtime

c08039a0 b xtime_cache

jiffies介紹

簡介

全局變量jiffies用來記錄自系統啟動以來產生的節拍的總數。

它被用來記錄系統自開機以來,已經過了多少tick。每發生一次timer interrupt,Jiffies變數會被加一。

啟動時,內核將該變量初始化為0,此后,每次時鐘中斷處理程序都會增加該變量的值。

因為一秒內時鐘中斷的次數等于Hz,所以jiffes一秒內增加的值也就為Hz,系統運行時間以秒為單位計算,就等于jiffes/Hz。

定義

externu64 __jiffy_data jiffies_64;externunsignedlongvolatile__jiffy_data jiffies;

其中,jiffies_64 和 jiffies 的低32位是重合的,因為32為的jiffies 最多50天就溢出了,而jiffies_64則不用關注溢出問題。

初始化

#define INITIAL_JIFFIES((unsignedlong)(unsignedint)(-300*HZ))jiffies=INITIAL_JIFFIES

可以看出 jiffies 被初始化為5分鐘后溢出的一個值,這是為了方便內核調試,以便故障早點出來。

獲取

由于jiffies_64 是一個符合變量,不能直接獲取,需要下面的使用輔助函數

#if(BITS_PER_LONG<64)u64 get_jiffies_64(void);#elsestaticinline u64 get_jiffies_64(void){return(u64)jiffies;}#endif

當然也可以使用硬編碼的方式使用 ?jiffies

root@hy:/home/#cat/boot/System.map|grep"D jiffies"c06e3b00 D jiffies

c06e3b00 D jiffies_64

從中也可以看到?jiffies 與?jiffies_64的地址是相同的

使用

由于jiffies在五分鐘之后,便溢出,所以使用jiffies的原則如下

//如果jiffies變量類型是32位無符號intmax_count=0xffffffffor

max_count=0xffffffffffffffff(64-bit)//如果沒有溢出,系統啟動后運行的節拍數:jiffies-ITIAL_JIFFIES//系統啟動來5分鐘的節拍數就是(到jiffies溢出的前一拍):max_count-INITIAL_JIFFIES

在我的代碼中,我是這樣使用的

unsigendlongjiffies_test=jiffies+HZ;if(time_after(jiffies,jiffies_test)){jiffies=MAX_JIFFIES-jiffies;}else{jiffies=jiffies-INITIAL_JIFFIES;}

其中的 time_after 是內核提供的四個比較函數之一

#definetime_after(a,b)\(typecheck(unsignedlong,a)&&\

typecheck(unsignedlong,b)&&\((long)(b)-(long)(a)<0))#definetime_before(a,b)time_after(b,a)#definetime_after_eq(a,b)\(typecheck(unsignedlong,a)&&\

typecheck(unsignedlong,b)&&\((long)(a)-(long)(b)>=0))#definetime_before_eq(a,b)time_after_eq(b,a)

為什么time_after能判斷溢出呢?

待續,或者 參考下面鏈接

鏈接

http://book.51cto.com/art/200810/93773.htm

http://blog.csdn.net/michaelcao1980/article/details/7826326

http://lxr.oss.org.cn/source/include/linux/jiffies.h?v=2.6.30#L167

http://blog.csdn.net/chchchdx123/article/details/6270022

http://linux.gongxiang8.com/456430/

如果您喜歡這篇文章,歡迎分享訂閱。本文內容遵CC版權協議?轉載請注明出處www.yandong.org

總結

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

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