原始碼是長這個樣子的, 小而美!
static
int uptime_proc_show(struct seq_file *m, void *v)
static
int uptime_proc_open(struct inode *inode, struct file *file)
static
const
struct file_operations uptime_proc_fops = ;
static
int __init proc_uptime_init(void)
fs_initcall(proc_uptime_init);
此時使用命令讀取uptime是這樣的:
cat /proc/uptime
47.69
22.13
這就是剛剛開機不久後的開機時間47秒, cpu空閒22秒
為了理清楚核心的時間的關係, 加了除錯列印, 即get_xtime_and_monotonic_and_sleep_offset() 及其後面的seq_printf
static
int uptime_proc_show(struct seq_file *m, void *v)
此時的輸出變成了這個樣子:
xtime:
1262311849.44
wtime:
3032655555.40
stime:
0.00
mtime:
108.85
108.85
76.50
static
struct timekeeper timekeeper;
刪除了無效的結構, 只關注主要的結構成員:
......
/* current clock_realtime time
in seconds */
u64 xtime_sec;
/* clock shifted nano seconds */
u64 xtime_nsec;
/** wall_to_monotonic is what we need to add to xtime (or xtime corrected
* for sub jiffie times) to
getto monotonic time. monotonic is pegged
* at zero at system boot time, so wall_to_monotonic will be negative,
* however, we will always keep the tv_nsec part positive so we can use
* the usual normalization.
** wall_to_monotonic is moved after resume from suspend for
the * monotonic time
notto jump. we need to add total_sleep_time to
* wall_to_monotonic to
getthe
real boot based time
offset.
** - wall_to_monotonic is no longer the boot time, getboottime must be
* used instead.
*/struct timespec wall_to_monotonic;
/* offset clock monotonic -> clock realtime */
ktime_t offs_real;
/* time spent in suspend */
struct timespec total_sleep_time;
/* offset clock monotonic -> clock boottime */
ktime_t offs_boot;
/* the raw monotonic time
forthe clock_monotonic_raw posix clock. */
......
- **xtime_sec 和xtime_nsec:** 是根本, 記錄的是當前的時間相對於1970-01-01 00:00:00 +0000 (utc)的差值. 硬體時間更新即是此值.
- **wall_to_monotonic:** 記錄了乙個差值(其實是乙個負值), 通過xtime_sec + wall_to_monotonic 可計算出當前的開機時間以來的乙個時間值(未記入計算機的時間), 即呼叫do_posix_clock_monotonic_gettime()返回的結果
- **total_sleep_time: ** 記錄了系統的休眠時間, 即通過呼叫do_posix_clock_monotonic_gettime()返回的結果
其實核心主要維護xtime, wall_to_monotonic 和 total_sleep_time三個值即可完成對系統時間的正確維護, 當然這裡沒有考慮ntp時間同步的因素, 如果增加了ntp時間同步會繁雜一些. block實現原理詳解
對於大多數人來講,block內部到底是怎樣實現的呢?我們可以借助clang將其編譯成為c 的 就可以看出,block到底是什麼東西,先來看這樣乙個問題,int age 10 void block age 30 block 10 以及下面的這一段 block int age 10 void block...
apache tomcat實現集群詳解
1 配置兩個tomcat 使用不同的埠 tomcat1 的修改conf server.xml 1.1 中的8005修改為18005 1.2修改下的 connectiontimeout 20000 redirectport 8443 中的8080為18080 1.3修改為18009 1.4在末尾加 j...
container of實現原理詳解
container of在核心函式中經常使用,該函式的功能是根據乙個結構體成員的指標,返回這個成員指標所在的結構體的首指標。舉例說明如下 struct std stuct std test int p test.d container of p,stuct std,d 這個函式將返回test變數的首...