Как узнать, сколько памяти разделяется между разветвленным процессом с копированием при записи в Linux?

Если есть процесс, который считывает большой файл и сохраняет его в своей памяти (или просто выделенный символ*), и этот основной процесс разветвляется, если дочерний процесс читает только из этой памяти (или char*), в соответствии с copy-on-write, память, в которой сохранен указатель, не копируется, и оба родителя и дочерние используют одну и ту же память, пока один из них не попытается записать в ту память, в которой сохранен указатель, и оба родителя и дочерние будут использовать одну и ту же память, пока один из них не попытается записать в ту память, в которой в случае, если процесс создает копию памяти и изменяет ее.

Итак, мой вопрос заключается в том, что если реализована запись при копировании, есть ли способ узнать объем памяти, который использует ребенок, который не используется совместно с основным процессом? Другими словами, сколько памяти на самом деле использует детский процесс, если он использует память родителей от некоторых прочитанных звонков?

Команды top, или ps, дают только тот общий объем памяти, который должен иметь ребенок. (Т.е. предполагая, что данные в памяти или указателе копируются дочерним элементом.)

Есть ли способ получить объем данных, который фактически используется семантикой CoW?

Я просмотрел /proc/[pid]/smaps, как предлагали экс и Мат, но все, что я нашел, было много пустых файлов smaps. Я попробовал эту команду, чтобы найти, в каких файлах есть данные: tail -n 5 */smaps | меньше И o/p, которое я получил, было

==> 1012/smaps <==

==> 1074/smaps <==

==> 10/smaps <==

==> 1148/smaps <==

==> 11862/smaps <==

==> 11/smaps <==

==> 1355/smaps <==

==> 1356/smaps <==

==> 1357/smaps <==

==> 1358/smaps <==

==> 1361/smaps <==

==> 13/smaps <==

==> 14900/smaps <==

==> 14/smaps <==

==> 1501/smaps <==

==> 15/smaps <==

==> 1684/smaps <==

==> 1685/smaps <==

==> 16/smaps <==

==> 17772/smaps <==

==> 17827/smaps <==

==> 17/smaps <==

==> 18490/smaps <==

==> 18/smaps <==

==> 1932/smaps <==

==> 1934/smaps <==

==> 19863/smaps <==

==> 19/smaps <==

==> 1/smaps <==

==> 20125/smaps <==

==> 20126/smaps <==

==> 20127/smaps <==

==> 20128/smaps <==

==> 20129/smaps <==

==> 20134/smaps <==

==> 20135/smaps <==

==> 20811/smaps <==

==> 20868/smaps <==

==> 20/smaps <==

==> 21116/smaps <==

==> 21774/smaps <==

==> 21/smaps <==

==> 22393/smaps <==

==> 22394/smaps <==

==> 22395/smaps <==

==> 22398/smaps <==

==> 22639/smaps <==

==> 22824/smaps <==

==> 22/smaps <==

==> 23009/smaps <==

==> 23058/smaps <==

==> 23059/smaps <==
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

==> 23835/smaps <==

==> 23961/smaps <==

==> 23962/smaps <==

==> 23963/smaps <==

==> 23964/smaps <==

==> 23/smaps <==

==> 24180/smaps <==

==> 24268/smaps <==

==> 24467/smaps <==

==> 24/smaps <==

==> 252/smaps <==

==> 25352/smaps <==

==> 25435/smaps <==

==> 25/smaps <==

==> 26465/smaps <==

==> 26/smaps <==

==> 27884/smaps <==

==> 27/smaps <==

==> 28/smaps <==

==> 29/smaps <==

==> 2/smaps <==

==> 303/smaps <==

==> 30/smaps <==

==> 316/smaps <==

==> 31/smaps <==

==> 32074/smaps <==

==> 32076/smaps <==

==> 32112/smaps <==
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

==> 32116/smaps <==
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

==> 322/smaps <==

==> 32466/smaps <==

==> 32467/smaps <==

==> 32/smaps <==

==> 33/smaps <==

==> 34/smaps <==

==> 37/smaps <==

==> 38/smaps <==

==> 3991/smaps <==

==> 3992/smaps <==

==> 39/smaps <==

==> 3/smaps <==

==> 4005/smaps <==

==> 4006/smaps <==

==> 4007/smaps <==

==> 4008/smaps <==

==> 4009/smaps <==

==> 4010/smaps <==

==> 4018/smaps <==

==> 4029/smaps <==

==> 4038/smaps <==

==> 4044/smaps <==

==> 4045/smaps <==

==> 4046/smaps <==

==> 4053/smaps <==

==> 4054/smaps <==

==> 4055/smaps <==

==> 40/smaps <==

==> 41/smaps <==

==> 42/smaps <==

==> 4339/smaps <==

==> 435/smaps <==

==> 436/smaps <==

==> 43/smaps <==

==> 44/smaps <==

==> 45/smaps <==

==> 46/smaps <==

==> 47/smaps <==

==> 48/smaps <==

==> 49/smaps <==

==> 4/smaps <==

==> 50/smaps <==

==> 51/smaps <==

==> 52/smaps <==

==> 53/smaps <==

==> 54/smaps <==

==> 55/smaps <==

==> 56/smaps <==

==> 57/smaps <==

==> 58/smaps <==

==> 5988/smaps <==

==> 59/smaps <==

==> 5/smaps <==

==> 6058/smaps <==

==> 6059/smaps <==
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

==> 60/smaps <==

==> 61/smaps <==

==> 62/smaps <==

==> 63/smaps <==

==> 64/smaps <==

==> 65/smaps <==

==> 66/smaps <==

==> 67/smaps <==

==> 68/smaps <==

==> 69/smaps <==

==> 6/smaps <==

==> 70/smaps <==

==> 71/smaps <==

==> 72/smaps <==

==> 73/smaps <==

==> 74/smaps <==

==> 771/smaps <==

==> 77/smaps <==

==> 782/smaps <==

==> 78/smaps <==

==> 79/smaps <==

==> 7/smaps <==

==> 80/smaps <==

==> 814/smaps <==

==> 819/smaps <==

==> 81/smaps <==

==> 82/smaps <==

==> 83/smaps <==

==> 84/smaps <==

==> 8654/smaps <==

==> 8655/smaps <==

==> 8656/smaps <==

==> 892/smaps <==

==> 8/smaps <==

==> 949/smaps <==

==> 950/smaps <==

==> 9/smaps <==

==> self/smaps <==
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

Так что же мне теперь делать? У меня есть процессы с пустыми smap, которые выполняются. Как получить карты этих pid?

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 1 June 2016 в 01:05
поделиться