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进程创建时间计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 严格模式_MySQL 开启/
- 下一篇: linux ip隧道技术,linux之I