即使内存是物理共享的,每个进程都有自己的虚拟内存映射,即使映射相同的区域,也会“消耗”一个独立的寻址空间—您可以在vsize列中看到它。在任何情况下(即使在
malloc()
)内核将为每个进程保留一个独立的寻址空间,但不会立即在
后备存储器
.
一旦开始对分配的内存进行读/写操作,就会将虚拟页分配给相应的
后备存储器
:常驻人数相应增加。
这些页面是“干净”的,如果你刚刚阅读,如果你写给他们,“脏”的,直到他们不同步。(见
/proc/PID/smaps
,
/proc documentation
,
man pmap
:此工具允许您区分共享和私有内存、脏页和干净页)
MAP_POPULATE
选项立即预分配所有页面。如果映射是
MAP_PRIVATE
允许页面保持不干净,直到它们未显式与
msync()
. 脏页被缓存在RAM中,事实上,一旦使用更多带有私有映射的页,可用系统内存就会减少。
在另一侧,使用
MAP_SHARED
,您需要内核使虚拟页与
后备存储器
.
但是对于一个映射文件,后备存储不是内存,而是文件——因为它是交换空间。所以您会有一个奇怪的效果,即映射文件被计为常驻集。
这可以通过观察
/proc/PID/status
:
VmRSS size of memory portions. It contains the three
following parts (VmRSS = RssAnon + RssFile + RssShmem)
RssAnon size of resident anonymous memory
RssFile size of resident file mappings
RssShmem size of resident shmem memory (includes SysV shm,
mapping of tmpfs and shared anonymous mappings)
vmrss通常被称为rss。
在这种情况下,RSS不计算物理内存,但文件映射:请求时,系统总内存大部分不受影响
MAPX共享
,因为大多数情况下不缓存任何页面(缓存的,脏页将在
RssAnon
)必须将它们刷新到共享
后备存储器
(文件)尽快。
正如您正确地观察到的,RSS在每个进程中都被计算一次,即使是共享的。你可以在里面找到
/PRO/PID/SMAPS
另一个计数器,PSS(比例设置大小)-也可参见此答案:
What does pss mean in /proc/pid/smaps
一个进程的“比例集大小”(PSS)是它在内存中拥有的页数,其中每一页都除以共享它的进程数。因此,如果一个进程本身有1000页,并且与另一个进程共享1000页,那么它的PSS将是1500页。
一个注意事项:您可以使用
MAP_SHARED|MAP_POPULATE
仅使用
tmpfs
-否则,您将使用基于文件的共享。如果要查找IPC共享内存,请查看
shmget()
.
测验
我已经用一个小程序验证了我的语句,该程序从一个带有不同标志的文件映射了2GB,然后用
memset()
.
地图私有
ps -u
输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
xxxx 15767 0.5 4.1 2004216 666944 pts/1 S+ 12:54 0:00 ./mm 1
从
/PRO/PID/SMAPS
:
7f143e5ec000-7f14b870c000 rw-p 00000000 fd:00 201562609 /home/xxxx/test/mm.dat
Size: 2000000 kB
Rss: 666668 kB
Pss: 666668 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 666668 kB
Referenced: 666668 kB
Anonymous: 666668 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr mr mw me ac sd
从
/过程/PID/状态
:
VmRSS: 666944 kB
RssAnon: 666560 kB
RssFile: 384 kB
RssShmem: 0 kB
map_private_map_populate
PS-U
输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
xxxx 17045 31.0 12.3 2004216 2000412 pts/1 S+ 13:01 0:01 ./mm 2
从
/PRO/PID/SMAPS
:
7f14aa983000-7f1524aa3000 rw-p 00000000 fd:00 201562609 /home/xxxx/test/mm.dat
Size: 2000000 kB
Rss: 2000000 kB
Pss: 2000000 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 2000000 kB
Referenced: 2000000 kB
Anonymous: 2000000 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr mr mw me ac sd
从
/过程/PID/状态
:
VmRSS: 2000412 kB
RssAnon: 2000032 kB
RssFile: 380 kB
RssShmem: 0 kB
MAPX共享
PS-U
输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
xxxx 17670 18.0 4.1 2004216 666944 pts/1 S+ 13:06 0:00 ./mm 3
从
/PRO/PID/SMAPS
:
7f01db018000-7f0255138000 rw-s 00000000 fd:00 201562609 /home/xxxx/test/mm.dat
Size: 2000000 kB
Rss: 666668 kB
Pss: 666668 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 666668 kB
Private_Dirty: 0 kB
Referenced: 666668 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr sh mr mw me ms sd
从
/过程/PID/状态
:
VmRSS: 666944 kB
RssAnon: 96 kB
RssFile: 666848 kB
RssShmem: 0 kB
map_shared_map_populate
PS-U
输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
xxxx 18259 16.1 12.3 2004216 2000480 pts/1 S+ 13:10 0:00 ./mm 4
从
/PRO/PID/SMAPS
:
7ff0d020b000-7ff14a32b000 rw-s 00000000 fd:00 201562609 /home/xxxx/test/mm.dat
Size: 2000000 kB
Rss: 2000000 kB
Pss: 2000000 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 2000000 kB
Private_Dirty: 0 kB
Referenced: 2000000 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr sh mr mw me ms sd
从
/过程/PID/状态
:
VmRSS: 2000480 kB
RssAnon: 96 kB
RssFile: 2000384 kB
RssShmem: 0 kB
map_shared_map_populate,两个实例
PS-U
输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
xxxx 18259 0.1 12.3 2004216 2000480 pts/1 S 13:10 0:00 ./mm 4
xxxx 19521 5.8 12.3 2004216 2000480 pts/1 S+ 13:19 0:00 ./mm 4
从
/程序/PID/SMAPS
,仅第一个PID:
7ff0d020b000-7ff14a32b000 rw-s 00000000 fd:00 201562609 /home/xxxx/test/mm.dat
Size: 2000000 kB
Rss: 2000000 kB
Pss: 1000000 kB
Shared_Clean: 2000000 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 2000000 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: rd wr sh mr mw me ms sd
从
/过程/PID/状态
:
vmrss:20000480kb
rssanon:96千字节
rss文件:2000384 KB
rssshmem:0千字节