top - 10:49:30 up 4 days, 13:08, 1 user, load average: 0.10, 0.28, 0.20
任务: 306 total, 1 running, 304 sleeping, 0 stopped, 1 zombie
%Cpu(s): 3.5 us, 1.4 sy, 0.0 ni, 95.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15897.9 total, 235.3 free, 8007.0 used, 7655.7 buff/cache
MiB Swap: 2048.0 total, 1687.5 free, 360.5 used. 7403.8 avail Mem
进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
446465 ceragon 20 0 11.7g 5.1g 535188 S 25.0 33.0 38:23.92 ld-linux-x86-64
517659 ceragon 20 0 15112 3984 3204 R 12.5 0.0 0:00.02 top
452 root -51 0 0 0 0 S 6.2 0.0 0:52.38 irq/168-iwlwifi
328018 ceragon 20 0 11.7g 2.4g 465028 S 6.2 15.2 69:05.34 ld-linux-x86-64
1 root 20 0 169256 11512 6604 S 0.0 0.1 0:09.36 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.09 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
MiB Mem : 15897.9 total, 235.3 free, 8007.0 used, 7655.7 buff/cache
MiB Swap: 2048.0 total, 1687.5 free, 360.5 used. 7403.8 avail Mem
const char *Uniq_nlstab[uniq_MAX];
static void build_uniq_nlstab (void) {
Uniq_nlstab[MEMORY_lines_fmt] = _(""
"%s %s:~3 %9.9s~2total,~3 %9.9s~2free,~3 %9.9s~2used,~3 %9.9s~2buff/cache~3\n"
"%s %s:~3 %9.9s~2total,~3 %9.9s~2free,~3 %9.9s~2used.~3 %9.9s~2avail %s~3\n");
}
const char *Norm_nlstab[norm_MAX];
static void build_norm_nlstab (void) {
Norm_nlstab[WORD_abv_mem_txt] = _("Mem ");
Norm_nlstab[WORD_abv_swp_txt] = _("Swap");
}
unsigned long kb_main_free;
unsigned long kb_main_total;
unsigned long kb_swap_free;
unsigned long kb_swap_total;
unsigned long kb_main_available;
unsigned long kb_swap_used;
unsigned long kb_main_used;
static void summary_show (void) {
struct {
char buf[10];
} buftab[8];
#define bfT(n) buftab[n].buf
// kb 转 mb
#define mkM(x) (float)kb_main_ ## x / scT(div)
// kb 转 mb
#define mkS(x) (float)kb_swap_ ## x / scT(div)
unsigned long kb_main_my_misc = kb_main_buffers + kb_main_cached;
// total=kb_main_total; free=kb_main_free
prT(bfT(0), mkM(total)); prT(bfT(1), mkM(free));
// used=kb_main_used; my_misc=kb_main_mymisc
prT(bfT(2), mkM(used)); prT(bfT(3), mkM(my_misc));
// total=kb_swap_total; free=kb_swap_free
prT(bfT(4), mkS(total)); prT(bfT(5), mkS(free));
// used=kb_swap_used; available=kb_main_available
prT(bfT(6), mkS(used)); prT(bfT(7), mkM(available));
show_special(0, fmtmk(N_unq(MEMORY_lines_fmt)
, scT(label), N_txt(WORD_abv_mem_txt), bfT(0), bfT(1), bfT(2), bfT(3)
, scT(label), N_txt(WORD_abv_swp_txt), bfT(4), bfT(5), bfT(6), bfT(7)
, N_txt(WORD_abv_mem_txt)));
}
int main (int dont_care_argc, char **argv) {
for (;;) {
frame_make();
}
}
static void frame_make (void) {
sysinfo_refresh(0);
}
static void sysinfo_refresh (int forced) {
static time_t sav_secs;
time_t cur_secs;
cur_secs = time(NULL);
if (3 <= cur_secs - sav_secs) {
meminfo();
sav_secs = cur_secs;
}
}
$ cat /proc/meminfo
MemTotal: 16279476 kB
MemFree: 8392428 kB
MemAvailable: 9981320 kB
Buffers: 127504 kB
Cached: 1722676 kB
SwapCached: 0 kB
typedef struct mem_table_struct {
const char *name; /* memory type name */
unsigned long *slot; /* slot in return struct */
} mem_table_struct;
#define MEMINFO_FILE "/proc/meminfo"
static int meminfo_fd = -1;
static char buf[8192];
void meminfo(void){
char namebuf[32];
// findme 就是 namebuf
mem_table_struct findme = { namebuf, NULL};
mem_table_struct *found;
char *head;
char *tail;
static const mem_table_struct mem_table[] = {
{"Buffers", &kb_main_buffers},
{"Cached", &kb_page_cache},
{"MemAvailable", &kb_main_available},
{"MemFree", &kb_main_free},
{"MemTotal", &kb_main_total},
{"SReclaimable", &kb_slab_reclaimable},
{"SwapFree", &kb_swap_free},
{"SwapTotal", &kb_swap_total},
}
// 将 /proc/meminfo 的内容复制到 buf 中
FILE_TO_BUF(MEMINFO_FILE,meminfo_fd);
head = buf;
for(;;){
tail = strchr(head, ':');
*tail = '\0';
// 将 head 的内容复制到 namebuf 中
// 由于上面将 : 替换为了 \0,所以只会复制 : 前面的内容
strcpy(namebuf,head);
// 就是检索 name 并找到相应的结构体。findme 就是 namebuf
found = bsearch(&findme, mem_table, mem_table_count,
sizeof(mem_table_struct), compare_mem_table_structs
);
head = tail+1;
// 为 slot 也就是 value 赋值
*(found->slot) = (unsigned long)strtoull(head,&tail,10);
}
kb_main_cached = kb_page_cache + kb_slab_reclaimable;
// 交换空间已使用内存
kb_swap_used = kb_swap_total - kb_swap_free;
mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
kb_main_used = (unsigned long)mem_used;
}