Как программы выделяют большие объемы памяти? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть 3 вопроса о распределении памяти, которые я думал лучше поставить в один вопрос, чем 3.

  1. Когда память выделяется, как я понимаю, она выделяется в куче, котораяэто просто 16 МБ.Как программы, такие как видеоигры или современные браузеры, могут использовать более 1 ГБ?

  2. Поскольку очевидно, что такой большой объем памяти может быть использован, почему он не может быть выделен наНачните?Я обнаружил, что максимум, что я могу выделить на языке ассемблера высокого уровня, составляет около 100 МБ.Это намного больше, чем 16 МБ, и намного меньше, чем у меня 3, так откуда же берется это ограничение?

  3. Зачем выделять память в первую очередь, а не выделять переменные икомпилятор / система обрабатывает это?

1 Ответ

7 голосов
/ 07 сентября 2011

Когда память выделяется, как я понимаю, она выделяется в куче, который просто 16 МБ. Как делать такие программы, как видеоигры или современные браузеры могут использовать более 1 ГБ?

Куча может расти. Это не ограничено никаким значением и конечно не 16 МБ. Вы можете легко выделить 1 ГБ кучи, просто сделайте тест программы, и вы увидите.

Поскольку очевидно, что можно использовать столько памяти, почему это не может быть выделено в начале? Я нашел максимум, что могу выделить на языке сборки высокого уровня составляет около 100 МБ. Это намного больше, чем 16 МБ, и гораздо меньше, чем у меня 3, так где же это откуда берутся ограничения?

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

Вы можете попробовать использовать системный вызов mmap, если malloc (который использует системный вызов brk), имеет какой-то вид вопроса. Обратите внимание, что для GNU libc , malloc фактически использует mmap вместо brk, когда выделение достаточно велико (думаю, более 128k).

Зачем выделять память в первую очередь, а не выделять переменные и позволить компилятору / системе справиться с этим?

Переменная должна где-то жить в памяти. Вы говорите: «Зачем вручную управлять памятью? Почему какой-то алгоритм не может сделать это для меня?». На самом деле, компилятор и компонент времени выполнения очень часто обрабатывают распределение / освобождение - это называется сборка мусора .

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