top里顯示的cpu百分比計(jì)算方式
程序很簡(jiǎn)單,基本都在top.c里。load里的cpu詳細(xì)信息代碼如下:1 smpcpu = cpus_refresh(smpcpu);
2
3 if (CHKw(Curwin, View_CPUSUM)) {
4 // display just the 1st /proc/stat line
5 summaryhlp(&smpcpu[Cpu_tot], "Cpu(s):");
6 } else {
7 int i;
8 char tmp[SMLBUFSIZ];
9 // display each cpu's states separately
10 for (i = 0; i < Cpu_tot; i++) {
11 snprintf(tmp, sizeof(tmp), "Cpu%-3d:", smpcpu[i].id);
12 summaryhlp(&smpcpu[i], tmp);
13 }
14 }Cpu_tot為cpu數(shù)量。cpus_refresh函數(shù)里從/proc/stat文件里讀入cpu信息,然后裝入smpcpu里。smpcpu為大小為Cpu_tot+1個(gè)CPU_t成員的數(shù)組。/proc/stat文件的頭幾行為:cpu %d %d
cpu0 %d %d
cpu1 %d %d第一行的cpu信息裝入smpcpu[Cpu_tot],之后的cpu0\cpu1\...裝入smpcpu[0]\smpcpu[1\...。View_CPUSUM這個(gè)由1鍵來(lái)控制的那個(gè)開(kāi)關(guān),開(kāi)關(guān)關(guān)閉時(shí)只顯示smpcpu的Cpu_tot,開(kāi)關(guān)開(kāi)啟時(shí)顯示的是smpcpu的下標(biāo)0~Cpu_tot-1的成員。即,top的默認(rèn)在開(kāi)頭顯示的cpu詳細(xì)信息顯示的是/proc/stat的第一行處理后,按下1鍵,顯示的時(shí)/proc/stat后續(xù)各cpu數(shù)據(jù)。/proc/stat里都是數(shù)字,下邊看看top里顯示的百分比怎么算的。CPU_t的定義:1 // These typedefs attempt to ensure consistent 'ticks' handling
2 typedef unsigned long long TIC_t;
3 typedef long long SIC_t;
4
5 // This structure stores a frame's cpu tics used in history
6 // calculations. It exists primarily for SMP support but serves
7 // all environments.
8 typedef struct CPU_t {
9 TIC_t u, n, s, i, w, x, y, z; // as represented in /proc/stat
10 TIC_t u_sav, s_sav, n_sav, i_sav, w_sav, x_sav, y_sav, z_sav; // in the order of our display
11 unsigned id; // the CPU ID number
12 } CPU_t;每次從/proc/stat取的數(shù)據(jù)稱為一幀的數(shù)據(jù),會(huì)從到CPU_t結(jié)構(gòu)體的第一行成員里,上次的數(shù)據(jù)即上一幀的數(shù)據(jù)就拷到CPU_t的第二排帶_sav后綴的成員里,一一對(duì)應(yīng)。summaryhlp函數(shù)里計(jì)算我們想看的cpu各詳細(xì)指標(biāo)的百分比。只取部分代碼或偽碼做演示:1 SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, tot_frme, tz;
2 float scale;
3 u_frme = cpu->u - cpu->u_sav;
4 s_frme = cpu->s - cpu->s_sav;
5
6 tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme;
7 if (tot_frme < 1) tot_frme = 1;
8 scale = 100.0 / (float)tot_frme;
9
10 us% = (float)u_frme * scale;
11 sy% = (float)s_frme * scale;
12
13 cpu->u_sav = cpu->u;
14 cpu->s_sav = cpu->s;
15每個(gè)進(jìn)程占cpu百分比計(jì)算:1 Frame_tscale = 100.0f / ((float)Hertz * (float)et * (Rc.mode_irixps ? 1 : Cpu_tot));
2 float u = (float)p->pcpu * Frame_tscale;算的是兩幀之間總時(shí)間片數(shù)量,各進(jìn)程占的時(shí)間片數(shù)量百分比。
posted on 2013-11-07 19:20 Sheppard Y 閱讀(2491) 評(píng)論(1) 編輯 收藏 引用 所屬分類: 開(kāi)源