2017-04-10 60 views
1

我正在研究互聯網家庭網關(openwrt,64位)。當我執行上面,我發現UPNPD進程分配的虛擬內存量巨大:[anon]在pmap中的含義linux cmd

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米 - >它可以達到1個G!

當我執行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 [anon]

問題: 1-這些塊的含義是什麼? 2-爲什麼我們爲每個線程映射這些區塊? 3-35爲什麼當殺死一個線程時,這些區域仍然映射?

回答

0

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) 

所以看起來程序在每個線程中都從堆中分配內存。

0

這只是一個保留的私人內存。

--- p權限意味着這種私人記憶與PROT_NONE分配

保留內存,它只是分配進程的虛擬地址空間,而不是記憶。