Даже если память физически разделена, каждый процесс имеет свое собственное сопоставление виртуальной памяти и будет «потреблять» независимое адресное пространство, даже если сопоставляет ту же область - вы можете увидеть это в столбце VSIZE.В любом случае (даже после malloc()
) ядро резервирует независимое адресное пространство для каждого процесса, но не сразу выделяет эквивалентные страницы в вспомогательном хранилище *1003*.
.когда вы начинаете чтение / запись в выделенную память, виртуальные страницы назначаются соответствующему резервному хранилищу : резидентный набор соответственно увеличивается.
Эти страницы "чистые", если вы только что прочитали, «грязный», если вы пишете им, пока они не синхронизируются.(см. документацию /proc/PID/smaps
, / proc , man pmap
: этот инструмент позволяет различать разделяемую и личную память, грязные и чистые страницы)
MAP_POPULATE
опция предварительно назначает всестраницы сразу.Если сопоставление равно MAP_PRIVATE
, страницы могут оставаться грязными до тех пор, пока они не будут явно синхронизированы с msync()
.Грязные страницы кэшируются в ОЗУ, и фактически доступная системная память уменьшается, как только вы используете больше страниц с частными сопоставлениями.
С другой стороны, используя 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 не учитывает физическую память в этомслучай, но отображение файла: общая системная память в основном не затрагивается при запросе MAP_SHARED
, так как в большинстве случаев страницы не кэшируются (кэшированные, грязные страницы будут учитываться в RssAnon
).Они должны быть сброшены в общее резервное хранилище (файл) как можно скорее.
Как вы правильно заметили, RSS подсчитывается один раз за процесс, даже если он используется совместно.Вы можете найти в /proc/PID/smaps
другой счетчик, PSS (размер пропорционального набора) - см. Также этот ответ:
Что означает pss в / proc / pid / smaps
«Размер пропорционального набора» (PSS) процесса - это количество страниц в памяти, где каждая страница делится на количество процессов, разделяющих ее.Таким образом, если у процесса есть 1000 страниц, и 1000 страниц совместно используются другим процессом, его PSS будет 1500
Одно примечание: Вы можете использовать общую память, используя MAP_SHARED|MAP_POPULATE
, используя только tmpfs
- иначе вы будете использовать файлообменник.Если вы ищете разделяемую память IPC, посмотрите shmget()
.
Тесты
Я проверил свои утверждения с помощью крошечной программы, которая сопоставила 2 ГБ из файла с другимпомечает, а затем записывает 1/3 страниц с memset()
.
MAP_PRIVATE
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
из /proc/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
из /proc/PID/status
:
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
от /proc/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
от /proc/PID/status
:
VmRSS: 2000412 kB
RssAnon: 2000032 kB
RssFile: 380 kB
RssShmem: 0 kB
MAP_SHARED
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
с /proc/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
с /proc/PID/status
:
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
с /proc/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
с /proc/PID/status
:
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
из /proc/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
из /proc/PID/status
:
VmRSS: 2000480 kB
RssAnon: 96 kB
RssFile: 2000384 kB
RssShmem: 0 kB