HTOP понимание

Извините, новичок в Linux/ Ubuntu. Я прочитал кучу htop посты здесь, но я просто хотел уточнить, что означают значения. Я запускаю 32-битную программу, и я понимаю, что примерно 4,2 - это максимальный объем памяти, который может использовать это приложение. Если я пройду через это, я получу ошибку вызова.

При взгляде на htopя смотрю на virt или res количество, чтобы увидеть, когда он приближается к этому пределу 4 ГБ?

верхнее изображение

1 ответ

Как указано в htop справочная страница:

M_RESIDENT (RES)

Размер резидентного набора (текст + данные + стек) процесса (т. Е. Размер используемой физической памяти процесса).

M_SIZE (VIRT)

Размер виртуальной памяти процесса.

Тем не мение, RES просто показывает, что - физическая память, это никоим образом не означает, что 32-разрядный двоичный процесс будет ограничен всего 4 ГБ, и фактически, если у вас включено расширение физических адресов, процесс может использовать больше, чем это. Физически, да, 2 32 адреса означают 4 ГБ физической ОЗУ. Согласно ответу Жиля (с моим акцентом):

32-битное ядро ​​Linux может выполнять только 32-битные процессы. В зависимости от параметров компиляции ядра каждый процесс может выделить только 1 ГБ, 2 ГБ или 3 ГБ памяти (остальное зарезервировано для ядра при обработке системных вызовов). Это количество виртуальной памяти, не связанное с какой-либо разбивкой между RAM, swap и mmapped файлами.

Также, согласно ответу Рамеша на сайте Unix & Linux, процессу может быть выделено большое количество памяти:

Максимум, что может адресовать процесс - это 4 ГБ. Вы потенциально путаете память с адресным пространством. Процесс может иметь больше памяти, чем адресное пространство. Это совершенно законно и довольно часто встречается в обработке видео и других приложениях, требующих большого объема памяти. Процесс может быть выделен десятки ГБ памяти и поменять его в адресном пространстве и из него по желанию. В адресное пространство пользователя одновременно может входить только 2 ГБ.

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

Подтверждено ответом прорыва:

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

...

Виртуальный адрес для данного процесса отображается на некотором физическом оборудовании хранения (ОЗУ, диск и т. Д.), Но сопоставление выполняется во время выполнения операционной системой и MMU.

Конечно, адресное пространство 4 ГБ подразумевает, что указатели все еще 32-битные.


Кроме того, ядро ​​Linux имеет Out Of Memory Killer / Manager, который очистит и освободит память. Другими словами, не беспокойтесь об ограничении в 4 ГБ, если вас беспокоит общая память процесса.

Если же мы говорим о выделении 4 ГБ в вашем коде, то в соответствии с соответствующим постом malloc() syscall будет фактически ограничен 4 ГБ выделений. Но вы можете сделать больше, чем один malloc() запрашивая более 4 ГБ в общей сложности (хотя я не совсем уверен, как это работает с физическим ограничением).

Другие интересные чтения:

Другие вопросы по тегам