程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> TOP CPU占用率原理及與實時線程的沖突

TOP CPU占用率原理及與實時線程的沖突

編輯:C++入門知識

linux下通過top或vmstat查看系統CPU占用率,在大多數情況下測得的CPU占用率是准確的,但在時間精度較高的實時linux系統中,top測量的CPU占用率可能會不准確,下面結合top原理和實時linux實例分析在實時系統中top的使用情況。

統計CPU占用率的時候,大致統計以下幾個時間:

用戶時間(User time)、系統時間(System time)、等待時間(Waiting time)、空閒時間(Idle time)、Nice時間、硬件終端處理時間等

其中主要計算用戶時間、系統時間和空閒時間,基本上這三個時間的百分比之和就是100%。我們知道使用top統計CPU占用率時,top的刷新頻率是可以更改的,默認情況下是3s刷新一次,也可以改為1s、0.1s等,既然top的刷新頻率可以更改,那麼top的最高刷新頻率是多少,CPU的占用率又是怎樣計算的呢?實際使用中,top中的數據是讀取/proc/stat文件獲得的,/proc/stat文件被讀取時會自動更新,從而top獲得最新的CPU占用率情況,但是/proc/stat文件也有刷新精度,它的刷新精度為每個時鐘中斷周期,即/proc/stat文件中的數據最快可以每個tick更新一次,每個時鐘中斷到來,系統查看當前CPU正在運行的進程,如果是用戶態進程,kernel_stat數據成員中對應的用戶態記錄數據增加一個tick,如果是內核態,則對應內核態成員記錄增加,top占用率的由來就是通過統計當前CPU每個tick運行進程種類得出來的,如用戶時間CPU占用率=用戶進程tick/總tick。正常情況下,我們知道linux是以時鐘周期為基礎進行進程調度,基本上在一個時鐘周期中不會發生進程調度,所以用top統計CPU占用率不會出錯。

但是在rt-linux中,時間顆粒精度不再是tick,有可能比tick更小,這個時候有可能出現一些進程或線程,它們的調度更加頻繁,例如在tick=2ms的實時linux中,有一個以1ms為周期的實時進程,這個時候我們用top統計實時進程所用CPU的CPU占用率的時候,就有可能得到不准確的結果。如下圖所示,當前CPU運行以1ms為周期的實時進程,紅色表示進程在處理數據,CPU忙,白色表示進程沒有處理數據,CPU空閒。因為實時進程和tick都是周期性的,且實時進程周期小於tick,所以有可能出現下面兩種情況。第一種是啟動實時進程的時刻,恰好時鐘中斷在CPU忙時統計當前CPU占用情況,又因為tick為實時進程周期的整數倍,所以時鐘中斷統計到的永遠都是CPU忙的時刻,這個時候反映在top上的結果就是當前CPU占用率為100%。而第二種情況,恰好時鐘中斷在CPU空閒時刻統計當前CPU占用情況,得到的結果永遠都是CPU處於空閒狀態,反映在top上時CPU占用率為0,。由上面的例子可以看出,當linux的始終粒度小於tick的時候,top的統計結果有可能是不准確的。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved