學習 Linux 時,常常能夠看到兩個詞:User space(用戶空間)和 Kernel space(內核空間)。安全
簡單說,Kernel space 是 Linux 內核的運行空間,User space 是用戶程序的運行空間。爲了安全,它們是隔離的,即便用戶的程序崩潰了,內核也不受影響。學習
Kernel space 能夠執行任意命令,調用系統的一切資源;User space 只能執行簡單的運算,不能直接調用系統資源,必須經過系統接口(又稱 system call),才能向內核發出指令。spa
str = "my string" // 用戶空間 x = x + 2 // 用戶空間 file.write(str) // 切換到內核空間 y = x + 4 // 切換回用戶空間
上面代碼中,第一行和第二行都是簡單的賦值運算,在 User space 執行。第三行須要寫入文件,就要切換到 Kernel space,由於用戶不能直接寫文件,必須經過內核安排。第四行又是賦值運算,就切換回 User space。code
查看 CPU 時間在 User space 與 Kernel Space 之間的分配狀況,可使用top
命令。它的第三行輸出就是 CPU 時間分配統計。blog
這一行有 8 項統計指標。接口
其中,第一項24.8 us(user 的縮寫)就是 CPU 消耗在 User space 的時間百分比,第二項0.5 sy(system 的縮寫)是消耗在 Kernel space 的時間百分比。進程
隨便也說一下其餘 6 個指標的含義。資源
若是想查看單個程序的耗時,通常使用time命令。虛擬機
程序名以前加上time命令,會在程序執行完畢之後,默認顯示三行統計。string
user和sys之和,通常狀況下,應該小於real。但若是是多核 CPU,這兩個指標反映的是全部 CPU 的總耗時,因此它們之和可能大於real。
User space vs kernel space