Какой вид памяти отображает реальное количество памяти, занимаемой процессом в Linux

В Linux имеется несколько видов системной памяти, самые известные из них – VIRT, RES и SHR. В др. ОС всё примерно аналогично, но зачастую не так прозрачно и называется по-своему. Для каждого процесса в Linux имеются значения всех этих видов памяти и значения эти у них оч. разные. Какой же вид памяти отображает, сколько памяти действительно занимает процесс в Linux? Разберём, что такое VIRT, RES и SHR память, чтобы иметь понимание.

Если вызвать какой-нибудь монитор процессов, напр., ps, top или htop, то можно увидеть, что они для каждого процесса отображают все виды памяти Linux. Самое большое число будет в графе VIRT. Приложение с легкостью может показывать VIRT в разы больше, чем у ПК есть физической памяти вообще, напр., из-за глупых настроек БД. VIRT это не фактически занимаемая оперативная память. В контексте, VIRT означает сколько памяти процесс объявил как «хочет» (не путать с «надо») и ОС выделила ему эту память из разных источников хранения. Процесс не имеет доступа к физической памяти напрямую, поэтому ОС выделяет ему память как виртуальную, некий абстрактный объём, которым может пользоваться процесс, исходя из его запросов желаний («хотелось бы столько-то»). А дальше менеджер памяти сам заботится о том, в какую конкретно память распределять данные, используемые процессом, в RAM, в SWAP и т.д. Этот показатель очень посредственным образом связан с тем, сколько действительно занял процесс.

Что же говорить о реальной памяти, отъедаемой процессом, тут надо смотреть на RES и с оглядкой на:

  1. Текущую загрузку системы по части используемой памяти (влияет, на количество страниц сброшенных на диск).
  2. Совместно используемая память. Два совершенно разных процесса, используя одни и те же библиотеки, уже загруженные в память, отобразят размер такой памяти в этом показатели – каждый из них отобразит, несмотря на то, что фактически память разделена между 2-мя независимыми процессами, да что там 2 – обычно это десятки и сотни процессов, и в таком случае RES будет больше реального объёма памяти, который занял процесс, потому что вне зависимости от существования процесса, количество используемой памяти вообще не изменится, т.к. она используется кем-то ещё.

Если хотите узнать, сколько реально памяти занимает процесс программы, нужно ориентироваться на RES.