在linux系统中,/proc/[pid]/status文件是一个特殊且非常重要的文件,该文件保存的都是对应进程PID的进程信息,包括进程所使用的内存大小,进程当前的状态优先级等,这些信息都是由系统内核动态生成的,因此在某种情况下,也表示当前系统的资源情况。
如图1和图2,是status文件里所包含的字段参数,每个字段都有其特定的含义:
图1
图2
字段说明Name表示当前进程的名称;
Umask表示进程创建文件时,初始设置的掩码,用于确定文件的默认权限,默认为0022;
State表示进程的状态;
Sleeping(S)表示等待状态,此时进程处于阻塞状态;
Running(R)表示进程正在运行或者等待运行;
Disk sleep(D)表示正在等待IO操作;
Zombie(Z)表示进程已中止,但是父进程还没中止,即所谓的僵尸进程;
tracing stop(T)表示进程已经停止,接收到SIGSTOP,SIGTSTP信号,或者进程正在被跟踪,即gdb调试;
TGID表示进程的PID,也叫线程组ID;
Ngid表示组ID;
Pid表示进程ID;
PPid表示该进程所属父进程的ID;
TracerPid表示当进程被gdb调试跟踪时,该跟踪进程的PID;
Uid表示进程的用户标识符;
Gid标识用户组标识符;和Uid一样有四组数据,分别表示实际用户ID(RUID),有效用户ID(EUID),保存设置的用户ID(SUID),文件系统ID(FSUID);
FDSize表示进程所打开的文件描述符的数量;
Groups表示进程所属附加组;
NStgid通常为进程PID;
NSpid通常为进程PID;
VmPeak表示进程在运行过程中,所占用内存的峰值,单位为KB;
VmSize表示进程正在使用的内存;
VmLck表示被进程锁定的内存大小,其作用时为了方便内存调度使用;
VmPin表示固定内存;
VmHWM表示程序分配的物理内存的最大值;
VmRSS表示当前进程正在使用的物理内存;
RssAnon表示当前进程使用匿名内存的页数;
RssFile表示进程在文件系统中所占用的内存大小;
RssShmem表示进程的共享内存的大小;
VmData表示进程数据段的大小,包括程序的可执行代码,全局变量等,单位为KB;
VmStk表示进程堆栈段的大小,单位为KB;
VmExe表示进程代码的大小,单位为KB;
VmLib表示进程使的库地址空间的大小,单位为KB;
VmPTE表示进程页表占用的内存大小;
VmSwap表示进程所用的交换空间的大小;
HugetlbPages表示进程所使用的大页内存的数量;
CoreDumping表示进程是否正在写入核心转储文件,1表示正在写入,表示没有发生核心转储;
Threads表示当前进程的线程数量,最小值为1;
SigQ表示当前进程待处理的信号数,/左侧数据表示待处理的数量,/右侧表示最大数量;
实例监测VmData字段的数据变化,VmData字段表示的是全局变量的大小,因此可以编写一个程序,使用malloc函数反复分配一定大小的空间给一个全局指针,然后实时监测VmData字段,如图:
图3
为了更方便快速的查看vmData字段的数据变化,示例程序中使用malloc函数之后,没有调用free函数进行释放,但是在实际开发中,malloc和free需要同时使用,否则会发生内存泄露。