Страницы

Поиск по вопросам

воскресенье, 24 ноября 2019 г.

Кроссплатформенный подсчёт потребления памяти процессом


На enSO имеются аналогичные вопросы, однако в основном ответы сводятся, либо к одной из ОС, либо вообще к использованию системных утилит в командной строке.

Наиболее подходящим из этих ответов к моей задаче оказался вот этот, но он выдаё
размер заимствованной процессом резидентной памяти, в то время как хотелось бы получить количество за вычетом разделяемой.

Если проиллюстрировать, то требуется значение в столбике "Память":



Возможно, что достаточно как-то модифицировать пример, приведённый по ссылке выше.

Дополнение

Ввиду возможного недопонимания, дополню вопрос пояснением, что подразумевается по
понятиями резидентная (RES) и разделяемая (SHR) память, занятая процессом. Достаточно детально этот момент расписан на этом сайте, однако попробую дать ответ, как я его понимаю, своими словами на простом примере.

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

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

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

Решение, основанное на том, чтобы подсмотреть исходный код утилит командной строк
является половинчатым, поскольку тоже самое в Windows будет сделать очевидно затруднительно.

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

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

Дополнение 2

Под "кроссплатформенным" решением подразумевается код для двух разных систем (Linu
и Windows), но собранный в одном месте. То есть для внешнего использования он универсален, тогда как внутри реализован под каждую платформу независимо:

#if defined(_WIN32)
...
#elif defined(__unix__) || defined(__unix) || defined(unix)
...
#endif


Дополнение 3

Судя по тому, что описано на msdn, информация, касающаяся разделяемой памяти, либ
вообще не предоставляется, либо моё приведение аналогии понятия разделяемой памяти между Linux и Windows вообще некорректно.
    


Ответы

Ответ 1



https://pythonhosted.org/psutil — вот отличный модуль, но на питоне. Там можно посмотреть исходники как берется потребляемая процессом память. См proc.memory_info() и memory_full_info(). У последнего есть uss — так вот это самое то. Впрочем резидентная и разделяемая там конечно же есть.

Комментариев нет:

Отправить комментарий