Наблюдение увеличения размера кучи при выделении данных с использованием proc / pid / status в Linux для процесса - PullRequest
0 голосов
/ 09 октября 2018

Я создал простую программу, которая распределяет целочисленный массив в куче / свободном хранилище каждый раз, когда пользователь нажимает «ввод».Моей конечной целью было увидеть изменение объема памяти кучи при каждом новом выделении.Я делаю это, проверяя файл состояния, чтобы увидеть изменение размера памяти кучи.К сожалению, при каждом выделении файл статуса не обновляется.Похоже, что единственный способ получить файл для обновления - это спамить программу с кучей возвратов каретки, а затем она обновляется.Почему он это делает?Мне нужен надежный метод для определения диапазона памяти, который мои программы занимают из динамического распределения, когда я работаю над встроенной системой.Кто-нибудь может предоставить какие-либо сведения о / proc // status или другой метод, который можно определить размер памяти кучи?

Кроме того, статус предоставляет память в килобайтах, было бы неплохо увидеть эту информацию с большей детализацией в байтах - есть ли способ сделать это?Спасибо.

Вот пример программы того, что я сделал:

#include <cstddef>
#include <iostream>

int keepLooping()
{
   return 1;
}   

int main (int argc, char* argv[])
{
   int exit_code = 0;
   int fd = -1;

   do
   {
      do 
      {
         std::cout << '\n' << "Press a key to allocate data to the heap...";
      } while (std::cin.get() != '\n');

      int *someArray = new int[1000];

   }
   while (keepLooping());

   return exit_code; 
}

1 Ответ

0 голосов
/ 09 октября 2018

Реализации C ++ обычно не распределяют каждое динамическое выделение непосредственно из операционной системы, а скорее запрашивают целые страницы памяти (по умолчанию 4 КБ в Linux) или более и распределяют меньшие выделения в процессе.Поэтому маловероятно, что операционная система сможет наблюдать меньшие изменения в использовании памяти процессом.

В некоторых системах Linux, в частности, с определенной конфигурацией, при выделении динамического хранилища не обязательно использует какую-либо системуРесурсы.Такие системы, которые over commit память не видят каких-либо изменений в использовании физической памяти, пока к выделенной памяти фактически не осуществляется доступ.

Существуют инструменты профилирования памяти, такие как valgrind , который можно использовать для упаковки процесса и точного измерения использования памяти кучи на протяжении всего процесса.

...