在pmap linux命令中,[anon]是什么意思?

3

我正在开发一个互联网家庭网关(openwrt,64位)。当我执行top命令时,我发现UPNPD进程正在分配大量的虚拟内存:

Mem: 239096K used, 215584K free, 0K shrd, 9652K buff, 39256K cached
CPU:   0% usr   0% sys   0% nic 100% idle   0% io   0% irq   0% sirq
Load average: 0.36 0.41 0.39 1/93 10104
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
 2196   930 root     S     394m  89%   0% upnpd -f -r 

--> 约394米 --> 它可以达到1G!!!

当我执行pmap pidof upnpd时,我发现有很大的块:

# pmap 2196
0000000000400000      88K r-xp  /usr/sbin/upnpd
0000000000426000       4K rw-p  /usr/sbin/upnpd
0000000000427000       4K rw-p    [ anon ]
0000000036d6e000     140K rw-p  [heap]
0000007f78000000     132K rw-p    [ anon ]
**0000007f78021000   65404K ---p    [ anon ]**
0000007f80000000    2596K rw-p    [ anon ]
0000007f80289000   62940K ---p    [ anon ]
0000007f84000000     132K rw-p    [ anon ]
0000007f84021000   65404K ---p    [ anon ]
0000007f88000000     132K rw-p    [ anon ]
0000007f88021000   65404K ---p    [ anon ]
0000007f8c000000     132K rw-p    [ anon ]
0000007f8c021000   65404K ---p    [ anon ]
0000007f90000000     132K rw-p    [ anon ]
0000007f90021000   65404K ---p    [ anon ]
0000007f95adb000       4K ---p    [ anon ]
0000007f95adc000     124K rw-p    [ anon ]
0000007f95afb000       4K ---p    [ anon ]
0000007f95afc000     124K rw-p  [stack:2249]
0000007f95b1b000       4K ---p    [ anon ]
0000007f95b1c000     124K rw-p  [stack:2248]
0000007f95b3b000       4K ---p    [ anon ]
0000007f95b3c000    1020K rw-p    [ anon ]
0000007f95c3b000       4K ---p    [ anon ]
0000007f95c3c000    1020K rw-p  [stack:2246]
0000007f95d3b000       4K ---p    [ anon ]
0000007f95d3c000    1020K rw-p  [stack:2245]
0000007f95e3b000       4K ---p    [ anon ]
0000007f95e3c000    1020K rw-p  [stack:2244]
0000007f95f3b000       4K ---p    [ anon ]
0000007f95f3c000    1020K rw-p  [stack:2243]
0000007f9603b000       4K ---p    [ anon ]
0000007f9603c000    1020K rw-p  [stack:2242]
0000007f9613b000       4K ---p    [ anon ]
0000007f9613c000    1020K rw-p    [ anon ]
0000007f9623b000       4K ---p    [ anon ]
0000007f9623c000    1020K rw-p  [stack:2240]
0000007f9633b000    1220K r-xp  /lib/libc-2.22.so
0000007f9646c000      60K ---p  /lib/libc-2.22.so
0000007f9647b000      16K r--p  /lib/libc-2.22.so
0000007f9647f000       8K rw-p  /lib/libc-2.22.so
0000007f96481000      16K rw-p    [ anon ]
0000007f96485000      84K r-xp  /usr/lib/libgsdf.so.1.0.0
0000007f9649a000      60K ---p  /usr/lib/libgsdf.so.1.0.0
0000007f964a9000       4K rw-p  /usr/lib/libgsdf.so.1.0.0
0000007f964aa000      16K rw-p    [ anon ]
0000007f964ae000      16K r-xp  /usr/lib/libthreadutil.so.6.0.3
0000007f964b2000      64K ---p  /usr/lib/libthreadutil.so.6.0.3
0000007f964c2000       4K rw-p  /usr/lib/libthreadutil.so.6.0.3
0000007f964c3000      32K r-xp  /usr/lib/libixml.so.2.0.8
0000007f964cb000      64K ---p  /usr/lib/libixml.so.2.0.8
0000007f964db000       4K rw-p  /usr/lib/libixml.so.2.0.8
0000007f964dc000     120K r-xp  /usr/lib/libupnp.so.6.3.2
0000007f964fa000      64K ---p  /usr/lib/libupnp.so.6.3.2
0000007f9650a000       4K rw-p  /usr/lib/libupnp.so.6.3.2
0000007f9650b000       8K rw-p    [ anon ]
0000007f9650d000      92K r-xp  /lib/libpthread-2.22.so
0000007f96524000      60K ---p  /lib/libpthread-2.22.so
0000007f96533000       4K r--p  /lib/libpthread-2.22.so
0000007f96534000       4K rw-p  /lib/libpthread-2.22.so
0000007f96535000      16K rw-p    [ anon ]
0000007f96539000     112K r-xp  /lib/ld-2.22.so
0000007f9655f000      16K rw-p    [ anon ]
0000007f96563000       4K r--p  [vvar]
0000007f96564000       4K r-xp  [vdso]
0000007f96565000       4K r--p  /lib/ld-2.22.so
0000007f96566000       8K rw-p  /lib/ld-2.22.so
0000007fd72dd000     132K rw-p  [stack]

提醒:Upnpd进程根据连接的客户端创建线程。 我注意到为每个创建的线程映射了一个块大小为65404K的块,例如:0000007f90021000 65404K ---p [ 匿名 ]

问题: 1- 这些块的含义是什么? 2- 为什么我们要为每个线程映射这些块? 3- 为什么杀死线程后,这些块仍然保持映射?

2个回答

4

pmap 使用 proc 文件系统获取信息。下面是来自 man proc 关于 /proc/[pid]/maps 文件的说明:

这些块的意义是什么?

如果路径名字段为空,则这是通过 mmap(2) 函数获取的匿名映射。除了通过 gdb(1)、strace(1) 或类似工具运行该进程外,没有简单的方法将其与进程源协调。

地址字段是映射所占用的进程地址空间。perms 字段是一组权限:

               r = read
               w = write
               x = execute
               s = shared
               p = private (copy on write)

所以似乎该程序在每个线程中从堆中分配内存。

1

这只是一块保留的私有内存。

--- p 权限意味着该私有内存是使用 PROT_NONE 分配的。

保留内存只是分配给进程虚拟地址空间的内存,而不是实际的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接