青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-162  評論-223  文章-30  trackbacks-0
基本原理
   1)系統(tǒng)CPU使用率等于兩個時間點的CPU非空閑時間差除以CPU時間總量差得到的百分比,這兩者可從/proc/stat文件獲得。
   2)系統(tǒng)內(nèi)存使用率等于系統(tǒng)物理內(nèi)存消耗量除以系統(tǒng)物理內(nèi)存總量(memtotal,以KB為單位)得到的百分比,這兩者可從/proc/meminfo文件獲得。
   3)進程CPU使用率等于進程CPU時間(pct,以jiffies為單位)除以進程運行時間(pt)得到的百分比,pct從/proc/pid/stat文件讀取utime和stime字段相加即得,pt等于系統(tǒng)運行時間(st,以秒為單位)減去進程啟動時間(pst,以jiffies為單位),st從/proc/uptime文件獲得,pst從/proc/pid/stat文件讀取starttime字段獲得。
   4)進程內(nèi)存使用率等于進程駐留集大小(rss)除以系統(tǒng)物理內(nèi)存總量(memtotal,以KB為單位)得到的百分比,rss從/proc/pid/stat讀取rss字段得到,以頁數(shù)為單位。

代碼實現(xiàn)
   1)基本結(jié)構(gòu)和接口定義在proc_stat.h頭文件內(nèi),如下所示
 1struct sys_cpu_time
 2{
 3    unsigned long long user,old_user;
 4    unsigned long long nice,old_nice;
 5    unsigned long long sys,old_sys;
 6    unsigned long long idle,old_idle;
 7    unsigned long long wait,old_wait;
 8    unsigned long long hirq,old_hirq;
 9    unsigned long long sirq,old_sirq;
10}
;
11
12struct sys_uptime
13{
14    double uptime;
15    double idle;
16}
;
17
18struct sys_mem_info
19{
20    unsigned long main_total;
21    unsigned long main_free;
22    unsigned long main_used; 
23    unsigned long main_buffers;
24    unsigned long main_cached;
25    unsigned long swap_total;
26    unsigned long swap_free;
27    unsigned long swap_used;
28    unsigned long swap_cached;
29}
;
30
31struct system_stat
32{
33    sys_cpu_time ct;
34    sys_mem_info mi;
35    sys_uptime   ut;
36}
;
37
38struct process_stat
39{
40    char name[16];
41    char state;
42    int ppid;
43    int pgrp;
44    int session;
45    int tty_nr;
46    int tpgid;
47    unsigned int flags;
48    unsigned long minflt;
49    unsigned long cminflt;
50    unsigned long majflt;
51    unsigned long cmajflt;
52    unsigned long utime;
53    unsigned long stime;
54    long cutime;
55    long cstime;
56    long priority;
57    long nice;
58    long threads;
59    long iterealvalue;
60    unsigned long long starttime;
61    unsigned long vsize;
62    long rss;
63}
;
64
65struct sys_mem_entry
66{
67    const char *name;
68    unsigned long *val;
69}
 ;
70
71static const int PROC_STAT    = 0x0001;
72static const int PROC_MEM     = 0x0002;
73static const int PROC_UPTIME = 0x0004;
74static const int PROC_ALL       = PROC_STAT|PROC_MEM|PROC_UPTIME;
75
76bool get_system_stat(system_stat& ss,int flag);
77
78bool get_system_usage(float& cpu,float& mem);
79
80bool get_process_stat(pid_t id,process_stat& ps);
81
82bool get_process_usage(pid_t id,float& cpu,float& mem,unsigned long long& uptime);
   以上sys_cpu_time、sys_mem_info和process_stat結(jié)構(gòu)只是從對應文件中選取了用于計算CPU和內(nèi)存使用率必須的部分字段,如果需求擴展,可以在其后添加更多的字段;sys_mem_info中的main_used和swap_used是引申字段,它們并不對應于/proc/meminfo文件。

   2)實現(xiàn)在proc_stat.cpp文件內(nèi),如下所示
  1static const char* PROC_FILE_STAT    = "/proc/stat";
  2static const char* PROC_FILE_MEMINFO = "/proc/meminfo";
  3static const char* PROC_FILE_UPTIME  = "/proc/uptime";
  4
  5static int compare_sys_mem_entry(const void *a, const void *b)
  6{
  7    return strcmp(static_cast<const sys_mem_entry*>(a)->name,static_cast<const sys_mem_entry*>(b)->name);
  8}

  9
 10inline ssize_t file2str(const char* file,char* buf,size_t len,int* pfd=NULL)
 11{
 12    int fd = -1;
 13    if(pfd) fd = *pfd;
 14
 15    if(-1 == fd){
 16         fd=open(file,O_RDONLY,0);
 17        if(-1==fd) return -1;
 18        if(pfd) *pfd = fd;
 19    }
else
 20        lseek(fd,0,SEEK_SET);
 21
 22    ssize_t ret = read(fd,buf,len-1);
 23    if(NULL==pfd) close(fd);
 24    if(ret <= 0return -1;
 25    buf[ret] = '\0';
 26
 27    return ret;
 28}

 29
 30bool get_system_stat(system_stat& ss,int flag)
 31{
 32    assert(flag&PROC_ALL);
 33
 34    char buf[2048];
 35    ssize_t ret;    
 36
 37    if(flag & PROC_STAT){
 38        static __thread int stat_id = -1;
 39        ret = file2str(PROC_FILE_STAT,buf,sizeof(buf),&stat_id);
 40        if (-1==ret) return false;
 41        sys_cpu_time* ct = &ss.ct;
 42        if(7!=sscanf(buf,"cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",&ct->user,&ct->nice,&ct->sys,&ct->idle,
 43            &ct->wait,&ct->hirq,&ct->sirq))
 44            return false;
 45    }

 46
 47    if(flag & PROC_UPTIME){
 48        static __thread int uptime_id = -1;
 49        ret = file2str(PROC_FILE_UPTIME,buf,sizeof(buf),&uptime_id);
 50        if(-1==ret) return false;
 51        sys_uptime* ut = &ss.ut;
 52        if(2!=sscanf(buf,"%lf %lf",&ut->uptime,&ut->idle))
 53            return false;
 54    }

 55
 56    if(flag & PROC_MEM){
 57        static __thread int mem_id = -1;
 58        ret = file2str(PROC_FILE_MEMINFO,buf,sizeof(buf),&mem_id);
 59        if(-1==ret) return false;
 60
 61        sys_mem_info *mi = &ss.mi;
 62        const sys_mem_entry mem_table[] = {
 63            {"Buffers",      &mi->main_buffers}
 64            {"Cached",       &mi->main_cached}
 65            {"MemFree",      &mi->main_free},   
 66            {"MemTotal",     &mi->main_total},  
 67            {"SwapCached",   &mi->swap_cached},
 68            {"SwapFree",     &mi->swap_free},    
 69            {"SwapTotal",    &mi->swap_total}
 70        }
;
 71
 72        char *beg,*end = buf + ret;
 73        char *colon,*lf;
 74        sys_mem_entry key,*sme;
 75
 76        for(beg=buf;beg<end;beg=lf+1){
 77            colon = strchr(beg,':');
 78            if(!colon) break;
 79            *colon++ = '\0';
 80            lf = strchr(colon,'\n'); 
 81            if(!lf) break;
 82            key.name = beg;
 83            sme = (sys_mem_entry*)bsearch(&key,mem_table,NUM_ELEMENTS(mem_table),sizeof(sys_mem_entry),compare_sys_mem_entry);
 84            if(sme) *(sme->val) = ::strtoul(beg=colon,&colon,10);
 85        }

 86        mi->main_used = mi->main_total - mi->main_free;
 87        mi->swap_used = mi->swap_total - mi->swap_free;
 88    }

 89
 90    return true;
 91}

 92
 93bool get_system_usage(float& cpu,float& mem)
 94{
 95    static __thread system_stat ss = {0};
 96    if(!get_system_stat(ss,PROC_MEM|PROC_STAT))
 97        return false;
 98
 99    sys_cpu_time* ct = &ss.ct;
100    long long user,nice,sys,idle,wait,hirq,sirq,sum;
101    user = ct->user - ct->old_user;
102    nice = ct->nice - ct->old_nice;
103    sys  = ct->sys - ct->old_sys; 
104    idle = ct->idle - ct->old_idle;
105    if(idle<0) idle = 0;
106    wait = ct->wait - ct->old_wait;
107    hirq = ct->hirq - ct->old_hirq;
108    sirq = ct->sirq - ct->old_sirq;
109    ct->old_user = ct->user;
110    ct->old_nice = ct->nice;
111    ct->old_sys  = ct->sys;
112    ct->old_idle = ct->idle;
113    ct->old_wait = ct->wait;
114    ct->old_hirq = ct->hirq;
115    ct->old_sirq = ct->sirq;
116
117    sum = user + nice + sys + idle + wait + hirq + sirq;
118    if(sum<1) sum = 1;
119    cpu = 100.0*(sum - idle)/sum;
120
121    sys_mem_info* mi = &ss.mi;
122    mem = 100.0*mi->main_used/mi->main_total;
123
124    return true;
125}

126
127bool get_process_stat(pid_t id,process_stat& ps)
128{
129    char buf[1024],name[64];
130
131    sprintf(name,"/proc/%u/stat",id);
132    ssize_t ret = file2str(name,buf,sizeof(buf));
133    if(-1==ret) return false;
134
135    char* beg = strchr(buf,'(');
136    if(!beg) return false;
137
138    char* end = strchr(++beg,')');
139    if(!end) return false;
140
141    size_t num = end - beg; 
142    if(num >= sizeof(name))
143        num = sizeof(name) -1;
144    memcpy(ps.name,beg,num);
145    ps.name[num] = '\0';
146
147    return 22/*1+5+1+6+6+1+1+1*/ == sscanf(end+2,
148        "%c "
149        "%d %d %d %d %d "
150        "%u "
151        "%lu %lu %lu %lu %lu %lu "
152        "%ld %ld %ld %ld %ld %ld "
153        "%Lu "
154        "%lu "
155        "%ld",
156        &ps.state, //1
157        &ps.ppid,&ps.pgrp,&ps.session,&ps.tty_nr,&ps.tpgid, //5
158        &ps.flags,//1
159        &ps.minflt,&ps.cminflt,&ps.majflt,&ps.cmajflt,&ps.utime,&ps.stime,//6
160        &ps.cutime,&ps.cstime,&ps.priority,&ps.nice,&ps.threads,&ps.iterealvalue, //6
161        &ps.starttime,//1
162        &ps.vsize,//1
163        &ps.rss); //1
164}

165
166bool get_process_usage(pid_t id,float& cpu,float& mem,unsigned long long& uptime)
167{
168    system_stat ss;
169    if(!get_system_stat(ss,PROC_MEM|PROC_UPTIME))
170        return false;
171
172    process_stat ps;
173    if(!get_process_stat(id,ps))
174        return false;
175
176    long HZ = sysconf(_SC_CLK_TCK);
177    unsigned long long pct = ps.utime+ps.stime;
178    uptime = (unsigned long long)ss.ut.uptime - ps.starttime/HZ;
179    cpu = uptime ? (100.0*pct/HZ)/uptime : 0.0;
180
181    long page_size = sysconf(_SC_PAGESIZE) >> 10;
182    mem = 100.0*ps.rss*page_size/ss.mi.main_total;
183
184    return true;
185}
   以上get_system_stat接口的實現(xiàn)中,sys_mem_entry數(shù)組mem_table中的元素對應于sys_mem_info中的字段,并按其名稱升序排列,便于二分查找。如果需求擴展改變了sys_mem_info結(jié)構(gòu)的成員,只須調(diào)整mem_table,保證元素按字段名稱升序排列即可。

性能優(yōu)化
   如果頻繁調(diào)用get_xxx_usage來獲得資源使用信息,那么存在著不斷打開和關閉描述符操作,而在某些情況下沒必要,例如讀取一些系統(tǒng)proc文件如/proc/stat、/proc/meminfo和/proc/uptime等,只需第一次調(diào)用時打開,后續(xù)直接讀數(shù)據(jù)即可,這樣更高效。所以file2str的實現(xiàn),支持一次打開,多次讀取,當進程退出時,系統(tǒng)內(nèi)核會自動關閉所有描述符。
posted on 2013-05-31 19:04 春秋十二月 閱讀(4982) 評論(0)  編輯 收藏 引用 所屬分類: System
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            黄色一区二区在线| 久久久九九九九| 久久精品国产清高在天天线| 亚洲图片欧美一区| 夜夜嗨一区二区| 亚洲校园激情| 亚洲欧美一区二区精品久久久| 亚洲一区二区在线观看视频| 亚洲一区美女视频在线观看免费| 亚洲一区二区三区精品在线观看| 国产精品99久久99久久久二8| 亚洲线精品一区二区三区八戒| 午夜激情综合网| 久久久www免费人成黑人精品| 久久一区国产| 欧美黄在线观看| 夜夜嗨av一区二区三区四区| 亚洲欧美文学| 欧美极品一区二区三区| 国产精品视频久久久| 激情视频一区二区三区| 一区二区不卡在线视频 午夜欧美不卡'| 一区二区三区四区五区精品| 午夜亚洲性色福利视频| 麻豆av一区二区三区| 亚洲精品少妇| 欧美在线免费观看视频| 欧美经典一区二区| 国内一区二区在线视频观看 | 亚洲小说欧美另类社区| 久久久99国产精品免费| 欧美日韩第一区| 国内精品国产成人| 亚洲视频1区| 免费h精品视频在线播放| 在线综合亚洲| 欧美国产日本高清在线| 尤物视频一区二区| 欧美自拍偷拍| 99精品欧美一区二区蜜桃免费| 久久久欧美一区二区| 国产精品日韩专区| 在线视频精品一| 免费一级欧美在线大片| 香蕉国产精品偷在线观看不卡 | 99riav国产精品| 美女爽到呻吟久久久久| 亚洲午夜在线视频| 欧美精品在线一区| 亚洲国产激情| 美女免费视频一区| 亚洲自拍偷拍一区| 国产精品av免费在线观看| 亚洲黄一区二区三区| 久久久久久亚洲精品不卡4k岛国| 一本久道久久久| 欧美日韩黄视频| 一本色道久久加勒比精品| 91久久国产综合久久91精品网站| 久久精品国产清自在天天线| 国产欧美日本一区视频| 午夜精品一区二区在线观看 | 另类尿喷潮videofree| 狠狠久久亚洲欧美专区| 久久久精品国产99久久精品芒果| 午夜精品av| 国产乱肥老妇国产一区二| 欧美一区二区高清在线观看| 香蕉成人久久| 精品999久久久| 亚洲电影在线观看| 欧美久久九九| 亚洲欧洲av一区二区| 亚洲一区二区三区视频| 国产欧美日韩高清| 久久久青草婷婷精品综合日韩 | 牛牛精品成人免费视频| 久久综合亚州| 在线亚洲一区二区| 亚洲视频1区| 国产主播一区二区三区| 美国成人直播| 欧美日本三区| 欧美一区三区二区在线观看| 欧美在线视频播放| 亚洲第一网站免费视频| 亚洲人成网站影音先锋播放| 欧美久久久久久久久| 亚洲欧美综合另类中字| 久久久精品一品道一区| 在线一区二区日韩| 欧美在线不卡视频| 亚洲精选国产| 亚洲欧美日韩综合国产aⅴ| 在线看一区二区| 99视频一区| 影音先锋在线一区| 亚洲另类自拍| 在线成人激情黄色| 日韩一区二区精品| 亚洲成人自拍视频| 亚洲香蕉在线观看| 亚洲成人在线网| 久久久xxx| 欧美日韩亚洲天堂| 久久久久久69| 欧美视频三区在线播放| 美女黄色成人网| 国产精品久久二区二区| 欧美成人情趣视频| 国产日韩成人精品| 日韩网站在线观看| 伊甸园精品99久久久久久| 一区二区三区国产精华| 亚洲激情在线观看| 欧美在线精品一区| 亚洲一品av免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久精品av麻豆的观看方式| 欧美日韩综合另类| 亚洲国产合集| 在线成人黄色| 久久精品99国产精品| 欧美一区在线直播| 国产精品久久久久久户外露出| 日韩午夜一区| 日韩午夜激情| 欧美精品久久久久久久久老牛影院| 美女精品国产| 国产综合欧美在线看| 国产目拍亚洲精品99久久精品| 亚洲精品一区在线观看| 亚洲日本中文字幕免费在线不卡| 久久激情婷婷| 欧美不卡一区| 亚洲人屁股眼子交8| 免费不卡视频| 亚洲黄一区二区三区| 亚洲激情在线播放| 噜噜爱69成人精品| 免费在线成人| 91久久精品一区| 欧美激情一区在线| 日韩视频免费| 午夜一区二区三区不卡视频| 国产精品美女久久久久久久 | 另类春色校园亚洲| 黄色精品网站| 久色婷婷小香蕉久久| 欧美激情按摩| 亚洲深夜福利视频| 国产精品人人爽人人做我的可爱| 亚洲欧美色婷婷| 久久久夜精品| 亚洲乱码国产乱码精品精可以看 | 一本高清dvd不卡在线观看| 久久久久在线观看| 亚洲国产欧美精品| 亚洲视频一区二区在线观看| 国产精品爽爽ⅴa在线观看| 亚洲一区二区精品在线观看| 久久九九有精品国产23| 91久久精品国产| 欧美啪啪成人vr| 午夜精品区一区二区三| 国产亚洲一区二区三区| 久久久视频精品| 最近看过的日韩成人| 亚洲欧美日韩国产综合精品二区 | 国产精品久久久久久久午夜| 亚洲欧美激情一区| 欧美成人午夜影院| 亚洲欧美日韩国产综合在线| 狠色狠色综合久久| 欧美xart系列高清| 亚洲一区二区三区在线| 久热精品视频在线观看一区| 一区二区三区四区国产| 伊人狠狠色j香婷婷综合| 欧美日韩国产精品| 久久久久成人精品| 亚洲午夜国产一区99re久久| 美女诱惑黄网站一区| 亚洲一区二区三区在线看| 激情校园亚洲| 国产精品亚洲综合一区在线观看| 美腿丝袜亚洲色图| 欧美伊人久久| 亚洲四色影视在线观看| 亚洲韩日在线| 牛牛国产精品| 久久嫩草精品久久久精品| 亚洲欧美亚洲| 国产精品99久久99久久久二8| 亚洲国产精品久久| 国产一区二区在线观看免费| 国产精品免费久久久久久| 欧美日韩国产在线播放| 美女主播一区| 久久午夜精品一区二区|