為什麼多次執行時「使用者」和「系統」時間會有所不同?

為什麼多次執行時「使用者」和「系統」時間會有所不同?

有一個不錯的問題和答案解釋「真實」、「使用者」和「系統」之間的關係。

它解釋了「真實」可能變化的原因,並將「使用者」和「系統」定義為進程實際在處理器上運行的時間。

現在讓我們完全忽略「真實」。我注意到,當多次運行相同應用程式時,它會給出不同的“sys”和“user”。

$time dummy_app
user    0m0.032s
sys     0m0.064s

$time dummy_app
user    0m0.020s
sys     0m0.084s

dummy_app 只是一個從 0 到 100000 計數的 for 迴圈。

為什麼執行相同的二進位檔案會在處理器上花費不同的時間?換句話說,為什麼同一個應用程式的「user」和「sys」不總是相同的?

答案1

為什麼同一二進位檔案在多次執行時執行時間不同

這裡的關鍵問題是 CPU 運作方式導致的不確定性行為。現代超標量 CPU 可以一次執行多條指令或更改要執行的命令的順序(亂序執行)。關於您的範例,快取使用的最佳化也可能適用。 RAM 比 CPU 本身慢幾個數量級,這就是使用密集快取的原因。二進位檔案的第二次運行可能會在快取中運行,從而消耗更少的 CPU 週期(CPU 等待從記憶體檢索資料的週期)。

關於real、user和sys行程時間統計的差異

其中一件事與另一件事不同。 Real是指實際經過的時間; User 和 Sys 指的是使用的 CPU 時間只能透過過程。

  • 真實的是掛鐘時間 - 從通話開始到結束的時間。這是所有經過的時間,包括其他進程使用的時間片和進程阻塞的時間(例如,如果它正在等待 I/O 完成)。

  • 使用者是花費的CPU時間量在使用者模式下程式碼(內核外)之內的過程。這只是執行進程時所使用的實際 CPU 時間。其他進程和進程花費的阻塞時間不計入此數字。

  • 系統是花費的CPU時間量在核心中過程內。這意味著執行系統呼叫所花費的CPU時間在核心中,與仍在用戶空間中運行的庫代碼相反。與「使用者」一樣,這只是進程使用的 CPU 時間。請參閱下面的核心模式(也稱為「管理程式」模式)和系統呼叫機制的簡要描述。

User+Sys會告訴您進程實際使用了多少 CPU 時間。請注意,這是跨所有 CPU 的,因此如果進程有多個線程,則可能會超過 報告的掛鐘時間Real。請注意,在輸出中,這些數字包括所有子進程(及其後代)的時間UserSys時間,以及它們可以被收集的時間,例如通過wait(2)waitpid(2),儘管底層系統調用分別返回進程及其子進程的統計資料。

來源

相關內容