Запрограммируйте, сколько памяти занимает программа

Обновлено: 07.07.2024

В наши дни компьютер может запускать множество программ одновременно. У ЦП нет проблем с обработкой всех этих программ, потому что ЦП имеет несколько ядер для обработки многозадачности.

Каждая из этих программ работает как один или несколько процессов. Каждый процесс выделяет для себя некоторый объем ОЗУ или памяти. Важно, чтобы процесс работал правильно. Если процессу не удается выделить достаточно ОЗУ или памяти, процесс не может быть создан, и программа не сможет запуститься.

Итак, одной из основных задач, которые вы выполняете на своем компьютере, является проверка того, сколько памяти или ОЗУ (оперативной памяти) использует каждый процесс. Потому что ОЗУ или память вашего компьютера ограничены.

Представьте себе случай, когда вы хотите запустить какую-то программу, но она не работает из-за нехватки памяти. Возможно, некоторые процессы используют много памяти, которая вам сейчас не нужна. Вы можете завершить или остановить эти процессы, чтобы освободить оперативную память или память, чтобы вы могли запускать важные программы.

В этой статье я покажу вам, как проверить использование памяти каждым из процессов, запущенных на вашем компьютере с Linux. Я буду использовать Debian 9 Stretch для всех демонстраций в этой статье. Но он должен работать на любых современных дистрибутивах Linux. Приступим.

Вы можете использовать команду ps для проверки использования памяти всеми процессами в Linux. Есть одна проблема с этой процедурой. ps на самом деле не показывает, сколько памяти использует процесс в формате КБ или МБ, но показывает, сколько памяти используется в процентах.

Вы можете проверить использование памяти (в процентах) всеми процессами, запущенными в вашей операционной системе Linux, с помощью следующей команды:


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


Проверка использования памяти процессами с помощью pmap:

Вы можете проверить память процесса или набора процессов в удобочитаемом формате (в КБ или килобайтах) с помощью команды pmap. Все, что вам нужно, это PID процессов, использование памяти которых вы хотите проверить.

Допустим, вы хотите проверить, сколько памяти использует процесс с PID 917. Для этого запустите pmap следующим образом:


Как видите, общий объем памяти, используемой процессом 917, составляет 516 104 КБ или килобайт. Здесь также можно увидеть, сколько памяти используют библиотеки и другие файлы, необходимые для запуска процесса с PID 917.


Если вас не волнует, сколько памяти используют библиотеки или другие зависимые файлы, запустите pmap следующим образом:

Как видите, на экране отображается только общая память, используемая процессом с PID 917.


Если вы хотите, вы можете дополнительно отфильтровать это с помощью awk и получить только размер в КБ или килобайтах. Для этого запустите pmap следующим образом:

Как видите, печатается только использование памяти в КБ или килобайтах.


Теперь вы также можете перечислить, сколько памяти используется несколькими процессами, используя их PID с pmap следующим образом:

ПРИМЕЧАНИЕ. Здесь 917 и 531 — идентификаторы процессов или PID. Вы можете указать столько PID, сколько захотите.


Использование pmap для получения списка использования памяти всеми процессами в килобайтах:

В этом разделе я покажу вам, как написать собственный сценарий оболочки для отображения использования памяти всеми процессами, запущенными в вашей операционной системе Linux, в удобочитаемом формате (килобайты или КБ).

Сначала создайте новый файл sysmon в текущем рабочем каталоге с помощью следующей команды:

Теперь сделайте файл исполняемым с помощью следующей команды:


sysmon — это сценарий оболочки, который отображает все запущенные процессы PID, OWNER, MEMORY (в КБ в порядке убывания) и COMMAND. Начнем.

Откройте скрипт sysmon в своем любимом текстовом редакторе, я буду использовать Kate.


Теперь первая команда, которую я собираюсь запустить, даст мне PID, OWNER и COMMAND всех запущенных процессов, разделенных двоеточием (:), и сохранит их в переменной RAWIN.Затем прокрутите вывод и распечатайте его на экране.


Как видите, я получаю правильный вывод.



Теперь пришло время обработать каждую строку, сохранить информацию, разделенную двоеточием, в отдельных переменных. Вот что я сделал в строках 7, 8 и 9.

Как видите, теперь я могу печатать PID, OWNER и COMMAND в собственном формате.


Теперь пришло время получить данные об использовании памяти для каждого PID. Строка 10 делает именно это.


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


Теперь все, что осталось сделать, это отформатировать вывод, чтобы он выглядел красиво. Я предпочитаю формат таблицы. Строка 5 выводит заголовок каждого столбца таблицы.


Наконец, я напечатал PID, OWNER, MEMORY (в КБ) и COMMAND каждого процесса в табличном формате, используя строку 14.

Как видите, это работает неплохо. Однако есть небольшая проблема: процессы неправильно отсортированы в порядке убывания использования памяти.


Чтобы это исправить, я удалил sort -bnr -k3 из строки 3 и завернул все в функцию оболочки sysmon_main(). Затем оставил работу по сортировке команде sort.

Окончательный сценарий оболочки выглядит примерно так:


Как видите, работает отлично.


Теперь вы можете переместить его куда-нибудь, например, /usr/bin, и выполнить его точно так же, как и другие команды, следующим образом:

У меня есть две программы, одна на C++, другая на ассемблере. Я хочу сравнить, сколько памяти они используют при работе соответственно. Как мне это сделать?

Я провожу тестирование в Windows, но мне также хотелось бы узнать, как это сделать в Linux.

9 ответов 9

В Linux попробуйте valgrind . Это удивительный инструмент со слишком большим количеством функций, чтобы простые смертные могли полностью его понять. Взгляните на массив valgrind .

Это очень полезно, но массив по умолчанию анализирует только динамическую память. Как мы можем прочитать по ссылке: «По умолчанию профилирование стека отключено, так как оно сильно замедляет работу Massif. [. ] Профилирование стека можно включить с помощью параметра --stacks=yes».

Запуск программы в одной оболочке. Откройте другую оболочку и запустите команду «top». он будет перечислять запущенные процессы и выделять много памяти, которую они потребляют. я думаю, вы можете опросить /proc/yourprocessid/stat, чтобы узнать, сколько памяти он использует с течением времени.

хм, это довольно круто, это похоже на команду ps, но динамическая. хотя мои программы довольно маленькие, поэтому я не думаю, что этот конкретный метод будет работать.

О, если бы это была короткая программа. просто поместите его в цикл, пока вы смотрите его в «верхней части» для i в <1..3>; сделать пс; Готово; запускает пс 3 раза. Или, если вы можете отредактировать свою программу, добавьте сон в конце, чтобы у вас было время сделать «ps» до завершения программы

Обычно вверху я беру столбец «RES» (резидентный размер) минус столбец «SHR» (размер общей памяти). В большинстве случаев это дает хорошее представление о том, сколько реально использует ваша программа.

В Windows можно использовать системный монитор.

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

Запустите системный монитор из меню "Пуск"/"Администрирование"/"Производительность"

Если вы хотите начать ведение журнала:

Выберите журнал производительности и предупреждение>Текущий журнал в левой части браузера.

Выберите новые настройки журнала.

Дайте подходящее имя для журнала, например. performance_Server для сервера

Он предложит вам одно меню. На вкладках «Общие» нажмите кнопку «Добавить» и выберите процесс, который вы хотите отслеживать. (Измените объект производительности на процесс, для «выбрать счетчики из списка» выберите «частные байты», для «выбора экземпляров из списка» выберите процесс, который вы хотите отслеживать.) После этого нажмите «Добавить» и закройте. Теперь измените интервал в соответствии с требованиями тестового примера. Теперь перейдите на вкладку «файлы журнала», измените тип файла журнала на формат csv или tsv. Теперь примените и нажмите OK.

Если вы хотите запустить/остановить ведение журнала:

Выберите конкретный журнал, который вы хотите запустить и остановить.

На панели инструментов выше вы увидите кнопку запуска и остановки.

Если вы хотите проверить содержимое файла журнала:

Нажмите Параметры/Данные из…

Выберите файл журнала для просмотра, нажмите OK

Перейти к экрану графика (Просмотр/Диаграмма)

Нажмите «Изменить/Добавить в диаграмму».

Добавьте необходимые элементы на диаграмму. (В случае, если необходимо проверить утечку памяти, вам необходимо просмотреть PrivateBytes процессов и их _Total)

Прочитайте значения из диаграммы (минимальные и максимальные значения отображаются внизу диаграммы)

Если вы хотите контролировать передачу по сети:

Отображение экрана диаграммы (Просмотр/Диаграмма)

Нажмите «Изменить/Добавить в журнал» и выберите элементы «Сетевой интерфейс\Отправлено байтов», если вы установили его в dl

Или сетевой интерфейс\ Получено байтов, если вы установили его в CRS-PC+

Отслеживание использования памяти:

В меню Пуск/Программы/Инструменты администрирования/ запустите программу Performance Monitor

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

Заполните поля следующим образом:

Счетчик: частные байты

Экземпляр: процесс, занимаемый памятью которого необходимо отобразить

Нажмите кнопку "Добавить"

Повторите последние два шага для каждого процесса, память которого необходимо отобразить

Закрыть окно, добавляющее процессы

В нижней части окна системного монитора находится список ранее выбранных процессов.

Как использовать записанные данные

  1. Теперь откройте файл Perfmon_.csv или Perfmon_.tsv с помощью WordPad или Excel.

Если вы открыли файл с помощью Excel, то с помощью параметра Сохранить как сохраните файл в формате Microsoft Excel.

annonymoususer016 → Предупреждение о мошенничестве

viliml → Что такое взлом?

FelixMP → CodeTON Round 1 (Дивизион 1 + Дивизион 2, рейтинг, призы!)

zihad18 → В чем разница между соревнованиями с разными названиями в codeforces и другими онлайн-судьями??

TooMuchPainTheseDays → НУЖНА ПОМОЩЬ: проблема с палиндромом

Jur_Cai → Почему вклад такой низкий?

Igoreshik99 → [Задача] Декомпозиция потока на s-t пути

Ломк → Вьетнамский региональный конкурс ICPC 2021 на VNOJ

Utkarsh.25dec → Приглашение на CodeChef March Long Challenge Two 2022 (рейтинг Div 3 и 4) — 25–28 марта

Хумус_ → Не могу отличить эти подачи

Jarekczek → Статистика цветов пользователей 2010-2021

awoo → Разбор Educational Codeforces Round 125

awoo → Educational Codeforces Round 125 [рейтинговый для Div. 2]

Григорий → Дорогие русские друзья — личное сообщение из Германии

Рахульгоэль → Ботомания 2022

AlexLuchianov → [Учебник] Разреженная таблица

Akash_champ → Как решить SUMMUL от Spoj?

lavish315 → Приглашение на CodeChef March Starters 31 (рейтинг Div 2, 3 и 4) — 23 марта

IntoTheNight → [Предложение] Увеличьте продолжительность конкурса по умолчанию до 3 часов

7oSkaaa → Темы Проблемы

AURRUM → Поле со списком «Отсутствующий дивизион» во время образовательных конкурсов

zzzzsust19 → Мне нужна помощь по проблеме cf 1657D при получении ошибки времени выполнения

E869120 → Онлайн-конкурс JOI Spring Camp 2022

Блог пользователя arjun95

как найти общее потребление памяти программой c/c++

Автор arjun95, история, 5 лет назад ,

Есть ли способ узнать, сколько памяти потребляет моя программа на С++. есть ли какой-либо инструмент или библиотека, с помощью которой я могу найти память, потребляемую моей программой.

Комментарии (18)

Если вы используете статические массивы и т. д., вы можете использовать Custom Invocation, чтобы узнать, сколько памяти занимает ваш код на серверах Codeforces.

Мне нужно рассчитать память на моем компьютере, есть ли другой способ? так как мне нужно экспериментальное сравнение пространственной сложности двух алгоритмов для моего проекта


(sizeof(array_0) + sizeof(array_1) + sizeof(array_2) + . + sizeof(array_k)) / 1048576.0 дает размер в мегабайтах

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

не могли бы вы объяснить, что это за значение "1048576.0" !! спасибо

Функция sizeof(a) возвращает размер массива a в байтах, поэтому вам нужно разделить результат на 2^20 = 1048576, чтобы преобразовать его в мегабайты.

Если вы работаете в Linux, вы можете использовать POSIX getrusage

Прочитайте справочную страницу, чтобы узнать, как это работает.

Это два элемента структуры, которые вам следует искать.

спасибо. теперь я понимаю

Если вам не нужна эта информация в программе, вы можете использовать терминальную программу (если вы используете Linux) /usr/bin/time с флагом -v.

Когда я запускаю эту команду, терминал показывает -v команда не найдена

реальный 0m0.085s пользователь 0m0.076s система 0m0.004s

я что-то упустил?

По-видимому, вы используете оболочку Bash, где время является зарезервированным словом (см. man bash — ГРАММАТИКА ОБОЛОЧКИ — Конвейеры). Вы должны написать это как env time -v ./a.out output1 . Или, возможно, добавьте псевдоним time='env time' в ваш .bashrc .

спасибо, теперь все работает.


Предполагаемый способ запуска программы, когда она затенена встроенной оболочкой, таков

спасибо, это тоже работает.

Есть ли что-нибудь, связанное с командой Windows? Якубе

Вы хотите сделать то же самое в Windows?

Насколько я знаю, с подсистемой Windows для Linux у вас есть (почти) полная среда Linux, и вы можете просто выполнять то же самое.

Кроме того, вы также можете установить любой другой доступный эмулятор терминала, например cmder или Terminus. С ними вы можете запустить ту же команду.

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

На примере игр. Я могу играть в игру, которая занимает 30 ГБ на моем жестком диске, но эта игра может использовать только 2 ГБ памяти. Очевидно, что игра не загружается сразу, но равно ли использование ОЗУ количеству данных, которые считываются + используются с жесткого диска?

tl;dr Почему игра, использующая 2 ГБ памяти, на самом деле использует 2 ГБ памяти, что является решающим фактором?

Предположим, у меня есть игра объемом 3 ГБ (требуется жесткий диск), но требуется 2 ГБ ОЗУ. Предположим, что есть 2 изображения по 0,5 ГБ, 2 звука по 0,5 ГБ и 1 код по 1 ГБ. В любой момент мне, вероятно, понадобится 1 изображение (0,5 ГБ), 1 звук (0,5 ГБ) и код (1 ГБ). Сложите их, и у вас будет 2 ГБ! Очевидно, что если отдел графики сделал каждое изображение размером 1 ГБ, то общие требования к жесткому диску для игры и использование ОЗУ возрастут!

2 ответа 2

"равно ли использование ОЗУ тому объему данных, который считывается + используется с жесткого диска?" Нет, это не так просто. Все современные операционные системы используют виртуальную память. Оперативная память, которую использует программа, почти всегда будет частью общего виртуального адресного пространства, определяемого программой, по двум причинам.

Во-первых, потому что программа почти никогда не будет обращаться ко всем v.a.s. это определяет. Например, предположим, что вы никогда не исследуете определенный коридор на игровом уровне — нет причин загружать эти данные с диска. Или, если вы не используете функцию нумерованного списка в Word, нет причин вводить этот код. Код и данные, как правило, "выгружаются по запросу", то есть они выгружаются только в том случае, если на них действительно ссылается ("запрашивает") программа.

Во-вторых, даже после того, как данные были выгружены, операционная система может решить, что что-то еще может лучше использовать часть ОЗУ и выгрузить часть ее, особенно если на нее не было ссылок какое-то время, и особенно в системах с небольшим объемом ОЗУ для их рабочей нагрузки (так называемое «давление ОЗУ»). Это также может относиться как к коду, так и к данным по отдельности. Наивным примером могут быть данные об уровне, на котором вы давно не были.

Результатом вышеизложенного является то, что объем оперативной памяти, «используемой» программой, на самом деле лучше рассматривать как объем виртуального адресного пространства, на которое программа ссылалась в последнее время, в дальнейшем ограниченный тем, что ОС позволяет программе использовать. Он может сильно различаться в зависимости от того, сколько у вас оперативной памяти, что еще работает в системе и что делает программа.

tl;dr: Это сложно. Глава «Управление памятью» книги Внутреннее устройство Windows, 6-е. изд., составляет около 200 страниц, что само по себе является приличной книгой.

Читайте также: