Linux uptime實現詳解

2021-08-08 20:35:02 字數 2710 閱讀 1371

原始碼是長這個樣子的, 小而美!

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變數的首...