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

1.4. Pid
进程 ID
1.5. PPid
父进程 ID
1.6. TracerPid
追逐当前进程的进程 ID
1.7. Uid
0 0 0 0
1.8. 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
1.9. FDSize
进程分配的文件描述符的最大值。只增不减。
1.10. Groups
启动该进程的用户所处组。由于是 root,所以为 0。
切换到 humou 用户,cp ./a.out /home/humou && cd /home/humou && chmod 777 a.out && su - humou && ./a.out

1.11. 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;
}1.12. VmSize
表示进程所占用的内存,包含交换分区。
1.13. VmLck
表示进程被锁住的内存,不允许交换到磁盘。需要使用系统调用 mlock 实现锁内存。相对于 VMPin, VmLck 被锁住的内存可以被内核在 RAM 中移动,程序下一次访问该页可能会触发软缺页中断,这对于一般程序来说没有影响,但对于硬实时的程序来说,这种错误不能被接受。
1.14. VmPin
固定内存是固定在特定页框位置的锁定内存。固定的页面既不能被移除物理内存,也不能被内核在 RAM 中移动。
1.15. VmHWM
表示程序分配到的物理内存峰值
1.16. VmRSS
表示程序现在使用的物理内存
测试: 在执行程序前,free -m,空闲内存为 3651MB , 交换分区空闲 832MB 
1.17. VmData
表示进程数据段的大小。
1.18. VmStk
表示进程堆栈段的大小。
1.19. VmExe
表示进程代码的大小。
1.20. VmLib
表示进程所使用 LIB 库的大小。
关于代码段,堆栈段,数据段:
代码段可以为机器中运行同一程序的数个进程共享
堆栈段存放的是子程序(函数)的返回地址、子程序的参数及程序的局部变量
数据段则存放程序的全局变量、常数以及动态数据分配的数据空间(比如用 malloc 函数申请的内存)
与代码段不同,如果系统中同时运行多个相同的程序,它们不能使用同一堆栈段和数据段。
1.21. VmPTE
进程占用交换分区的大小。
1.22. Threads
线程数
1.23. SigQ
表示当前进程待处理信号数。
1.24. SigPnd
0000000000000000
1.25. ShdPnd
0000000000000000
1.26. SigBlk
0000000000000000
1.27. SigIgn
0000000001001206
1.28. SigCgt
0000000180014c21
解释:
SigPnd: 屏蔽位,存储了该线程的待处理信号,等同于线程的 PENDING 信号。
ShnPnd: 屏蔽位,存储了该线程组的待处理信号。等同于进程组的 PENDING 信号。
SigBlk: 存放被阻塞的信号,等同于 BLOCKED 信号。
SigIgn: 存放被忽略的信号,等同于 IGNORED 信号。
SigCgt: 存放捕获的信号,等同于 CAUGHT 信号。 ————————————————
1.29. CapInh
0000000000000000
1.30. CapPrm
ffffffffffffffff
1.31. CapEff
ffffffffffffffff
1.32. CapBnd
ffffffffffffffff
解释:
CapInh: 表示能够被当前进程执行的程序继承的能力。
CapPrm: 表示进程能够使用的能力,在 cap_permitted 中可以包含 cap_effective 中没有的能力,这些能力是被进程自己临时放弃的,也可以说 cap_effective 是 cap_permitted 的一个子集。
CapEff: 当一个进程要进行某个特权操作时,操作系统会检查 cap_effective 的对应位是否有效,而不再是检查进程的有效 UID 是否为 0.
CapBnd: 是系统的边界能力,我们无法改变它。 ————————————————
1.33. Cpus_allowed
3
1.34. Cpus_allowed_list
0-1
解释:
Cpus_allowed:3 指出该进程可以使用 CPU 的亲和性掩码,因为我们指定为两块 CPU, 所以这里就是 3, 如果该进程指定为 4 个 CPU(如果有话), 这里就是 F(1111).
Cpus_allowed_list: 0-1 指出该进程可以使用 CPU 的列表,这里是 0-1. ————————————————