Проверка количества доступной оперативной памяти в работающей программе - PullRequest
2 голосов
/ 26 июня 2009

Моего друга попросили во время собеседования написать программу, которая измеряет объем доступной оперативной памяти. Ожидаемый ответ заключался в использовании malloc() в режиме бинарного поиска: выделение больших и больших частей памяти до получения сообщения об ошибке, уменьшение размера части и суммирование объема выделенной памяти.

Я считаю, что этот метод будет измерять объем виртуальной, а не физической памяти. Но мне стало любопытно по этому поводу.

Есть ли способ узнать объем доступной оперативной памяти внутри программы, не используя exec(dmesg |grep -i memory)?

Ответы [ 5 ]

5 голосов
/ 26 июня 2009

Вы правы: malloc () не делает различий между физической и виртуальной памятью. Фактически, в этом весь смысл виртуальной памяти: сделать такие детали не относящимися к программам.

Вы можете узнать, но это зависит от ОС. Например, Linux .

3 голосов
/ 26 июня 2009

Единственный способ сделать это - использовать некоторые функциональные возможности ОС. Использование malloc () бесполезно по ряду причин:

  • измеряет виртуальную память
  • ОС вполне может иметь ограничение для каждого процесса выделения памяти
  • выделение намного большего объема памяти, чем физически доступно, часто ухудшает стабильность платформ до такой степени, что предложенный в вопросе алгоритм «вернуться назад», вероятно, не будет работать
1 голос
/ 26 июня 2009

Использование malloc () покажет вам, сколько памяти можно выделить для одного процесса. Могут быть причины, по которым это меньше, чем общий объем виртуальной памяти. Например, у вас может быть квота ОС или 32-битное адресное пространство для каждого процесса.

(И, конечно же, виртуальная память> = RAM)

1 голос
/ 26 июня 2009

это зависит от ОС, и вам следует собирать такую ​​информацию из служб ОС, если вы не хотите создать собственный уровень управления памятью

0 голосов
/ 26 июня 2009

Очень зависит от ОС, но для Linux информация о системной памяти находится в / proc / meminfo. Вы также можете, вероятно, использовать интерфейс sysctl (http://www.linuxjournal.com/article/2365), чтобы получить эти данные в программе на Си.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...