linux — использование памяти в программе на C ++, как сообщает монитор ресурсов Gnome: путаница

Я смотрю на память, используемую моим приложением, чтобы убедиться, что я не выделяю слишком много, и я не совсем понимаю, что показывает мне Gnome Resource Monitor. Я использовал следующие фрагменты кода для выделения памяти в двух отдельных приложениях, которые в остальном идентичны; они не содержат ничего, кроме этого кода и вызова функции scanf (), чтобы приостановить выполнение, пока я хватаю использование памяти:

malloc(1024 * 1024 * 100);

а также

char* p = new char[1204*1024*100];

На следующем рисунке показано использование памяти моим приложением до и после каждой из этих строк:

Использование памяти

Теперь я много читал (но явно недостаточно) об использовании памяти (в том числе этот ТАК вопрос), и у меня возникли проблемы с разграничением записываемой памяти и виртуальной памяти. Согласно связанному вопросу,

«Записываемая память — это количество адресного пространства, которое имеет ваш процесс
выделены с правами записи «

а также

«Виртуальная память — это адресное пространство, которое есть у вашего приложения
выделяется»

1) Если я сам выделил память, наверняка у нее есть права на запись?

2) Связанный вопрос также заявляет (относительно malloc)

«… который на самом деле не выделит никакой памяти. (См. разглагольствование в конце
страницы malloc (3) для деталей.) «

Я не вижу никакой «напыщенной речи», и мои изображения показывают виртуальную память имеет выросла! Может кто-нибудь объяснить это, пожалуйста?

3) Если у меня есть чисто следующий код:

char* p = new char[100];

…Монитор ресурсов показывает, что объем памяти и доступная для записи память увеличились на 8 КБ — так же, как когда я выделял один полный мегабайт! — с увеличением виртуальной памяти на 0,1. Что здесь происходит?

4) На какой столбец я должен смотреть в мониторе ресурсов, чтобы увидеть, сколько памяти использует мое приложение?

Заранее большое спасибо за участие, и извините, если не поняли или пропустили что-либо, что могло бы заставить меня найти ответы самостоятельно.

3

Решение

Классы памяти, о которых сообщает монитор ресурсов Gnome (и, по сути, подавляющее большинство инструментов отчетности о ресурсах), — это не просто отдельные классы памяти — они перекрываются, поскольку они сообщают о различных характеристиках памяти. Некоторые из этих различных характеристик включают в себя:

  • виртуальная или физическая — вся память в адресном пространстве процессов в современных операционных системах является виртуальной; это виртуальное адресное пространство отображается на фактическую физическую память аппаратными возможностями ЦП; то, как это отображение сделано, является сложной темой сама по себе, с большим количеством различий между различными архитектурами
  • разрешения на доступ к памяти — память может быть читаемой, записываемой или исполняемой или любой их комбинацией (теоретически — некоторые комбинации на самом деле не имеют смысла и поэтому могут фактически не разрешаться аппаратным и / или программным обеспечением, но дело в том, что эти разрешения рассматриваются отдельно)
  • резидентный или нерезидентный — при использовании системы виртуальной памяти большая часть адресного пространства процесса может фактически не отображаться в настоящее время в реальную физическую память по ряду причин — возможно, она еще не была выделена; это может быть часть двоичного файла или одна из библиотек, или даже сегмент данных, который еще не был загружен, потому что программа еще не вызывала его; возможно, он был выгружен в область подкачки, чтобы освободить физическую память для другой программы, которая в этом нуждалась
  • shared vs private — части виртуального адресного пространства процессов, которые доступны только для чтения (например, реальный код программы и большинство библиотек), могут совместно использоваться другими процессами, использующими те же библиотеки или программы — это большой преимущество для общего использования памяти, так как 37 различных xterm запуск экземпляров не означает, что код для xterm необходимо загружать 37 раз в память — все процессы могут совместно использовать одну копию кода

Из-за этих и нескольких других факторов (общая память IPC, файлы с отображением в памяти, физические устройства, у которых есть области памяти, отображенные в аппаратном обеспечении и т. Д.), Определение фактической памяти, используемой любым отдельным процессом или даже всей системой, может быть сложным.

1

Другие решения

Более точный способ понять в Linux использование памяти работающей процесс это использовать Proc (5) файловая система.

Итак, если ваш процесс pid 1234, попробуйте

cat /proc/1234/maps

Обратите внимание, что процессы имеют свои адресное пространство в виртуальная память. Это адресное пространство может быть изменено ММАП (2) и другие Системные вызовы (2). По нескольким причинам эффективности таНос (3) а также free избегайте слишком большого количества этих системных вызовов и предпочитайте повторно использовать их ранее freeЗоны памяти. Итак, когда ваша программа free-ing (или, в C ++, delete-ing) некоторый фрагмент памяти, который часто помечается как повторно используемый, но не высвобождается обратно в ядро ​​(например, munmap). Точно так же, если вы malloc всего 100 байт, ваш libc разрешено, например, запросить целый мегабайт используя mmap (в следующий раз вы звоните malloc например, 200 байтов, он будет использовать часть этого magabyte)

Смотрите также http://linuxatemyram.com/ а также Расширенное программирование в Linux (а также этот вопрос о переполнении памяти)

2

По вопросам рекламы [email protected]