status
各字段说明
Name
进程名
State
进程状态,"R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)", or "X (dead)"
Tgid
线程ID,准确的说是主线程ID,因为程序a.out 有两个线程。

Pid
进程ID
PPid
父进程ID
TracerPid
追逐当前进程的进程ID
Uid
0 0 0 0
Gid
0 0 0 0
解释:
第一列RUID:实际UID,表示程序执行的用户UID。
第二列EUID:有效UID,表示进程执行时,对文件的访问权限。
第三列SUID:保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID。
第四列FSUID:目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的。
使用普通用户执行top:
su - humou
top
cat /proc/`pgrep top|grep -v grep`/status
FDSize
进程分配的文件描述符的最大值。只增不减。
Groups
启动该进程的用户所处组。由于是root,所以为0。
切换到humou用户,cp ./a.out /home/humou && cd /home/humou && chmod 777 a.out && su - humou && ./a.out

VmPeak
表示进程运行过程中占用内存的峰值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
int main(int argc,const char* argv[])
{
if (argc != 2)
{
printf("invalid param\n");
exit(-1);
}
size_t mb = strtoul(argv[1],NULL,0);
size_t nbytes = mb << 20;
char *ptr =(char*)malloc(nbytes);
if (ptr == NULL)
{
printf("malloc failed\n");
exit(-1);
}
printf("malloc %d MB\n",mb);
free(ptr);
pause();
return 0;
}
VmSize
表示进程所占用的内存,包含交换分区。
VmLck
表示进程被锁住的内存,不允许交换到磁盘。需要使用系统调用mlock实现锁内存。相对于VMPin, VmLck被锁住的内存可以被内核在RAM中移动,程序下一次访问该页可能会触发软缺页中断,这对于一般程序来说没有影响,但对于硬实时的程序来说,这种错误不能被接受。
VmPin
固定内存是固定在特定页框位置的锁定内存。固定的页面既不能被移除物理内存,也不能被内核在RAM中移动。
VmHWM
表示程序分配到的物理内存峰值
VmRSS
表示程序现在使用的物理内存
测试: 在执行程序前,free -m,空闲内存为3651MB ,交换分区空闲832MB
VmData
表示进程数据段的大小.
VmStk
表示进程堆栈段的大小.
VmExe
表示进程代码的大小.
VmLib
表示进程所使用LIB库的大小.
关于代码段,堆栈段,数据段:
代码段可以为机器中运行同一程序的数个进程共享
堆栈段存放的是子程序(函数)的返回地址、子程序的参数及程序的局部变量
数据段则存放程序的全局变量、常数以及动态数据分配的数据空间(比如用malloc函数申请的内存)
与代码段不同,如果系统中同时运行多个相同的程序,它们不能使用同一堆栈段和数据段.
VmPTE
进程占用交换分区的大小。
Threads
线程数
SigQ
表示当前进程待处理信号数。
SigPnd
0000000000000000
ShdPnd
0000000000000000
SigBlk
0000000000000000
SigIgn
0000000001001206
SigCgt
0000000180014c21
解释:
SigPnd:屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.
ShnPnd:屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk:存放被阻塞的信号,等同于BLOCKED信号.
SigIgn:存放被忽略的信号,等同于IGNORED信号.
SigCgt:存放捕获的信号,等同于CAUGHT信号. ————————————————
CapInh
0000000000000000
CapPrm
ffffffffffffffff
CapEff
ffffffffffffffff
CapBnd
ffffffffffffffff
解释:
CapInh:表示能够被当前进程执行的程序继承的能力.
CapPrm:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.
CapEff:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.
CapBnd:是系统的边界能力,我们无法改变它. ————————————————
Cpus_allowed
3
Cpus_allowed_list
0-1
解释:
Cpus_allowed:3指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).
Cpus_allowed_list: 0-1指出该进程可以使用CPU的列表,这里是0-1. ————————————————