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

9

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

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

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

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

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

==> 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

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

Зависит от операционной системы. Linux? Mat
да ОС это Linux. Prasanth Madhavan
unix.stackexchange.com/questions/33381/… может вас заинтересовать Mat
@ Мат: Хороший указатель. Я просто писал что-то подобное (хотя и гораздо менее полное). NPE

Ваш Ответ

1   ответ
5

Я не знаю инструмента, который дал бы вам эту информацию, но вы, вероятно, можете рассчитать ее на основе/proc/[pid]/smaps:

   /proc/[pid]/smaps (since Linux 2.6.14)
          This file shows memory consumption for each of  the  process’s  mappings.
          For each of mappings there is a series of lines such as the following:

              08048000-080bc000 r-xp 00000000 03:02 13130      /bin/bash
              Size:               464 kB
              Rss:                424 kB
              Shared_Clean:       424 kB
              Shared_Dirty:         0 kB
              Private_Clean:        0 kB
              Private_Dirty:        0 kB

          The  first  of these lines shows the same information as is displayed for
          the mapping in /proc/[pid]/maps.  The remaining lines show  the  size  of
          the mapping, the amount of the mapping that is currently resident in RAM,
          the number of clean and dirty shared pages in the mapping, and the number
          of clean and dirty private pages in the mapping.

Подробнее см.Получение информации о процессе & apos; использование памяти от/proc/pid/smaps.

Error: User Rate Limit Exceeded Prasanth Madhavan
Error: User Rate Limit Exceeded Prasanth Madhavan
Error: User Rate Limit Exceeded

Похожие вопросы