Почему фрагментация памяти является проблемой на 64-битной машине? - PullRequest
8 голосов
/ 17 декабря 2011

В 32-разрядной машине каждый процесс получает 4 ГБ виртуального пространства. В этом случае можно беспокоиться, что мы можем столкнуться с проблемой из-за фрагментации. Но в случае 64-битной машины у нас теоретически имеется огромная адресуемая виртуальная память, так почему же фрагментация памяти все еще остается проблемой (если она есть) в 64-битной машине?

Ответы [ 2 ]

6 голосов
/ 17 декабря 2011

Каждый виртуальный адрес, к которому вы пытаетесь получить доступ, сопоставляется операционной системой с физической памятью. Физическая память выделяется в страницах (например, размером 4 КБ). Если вам удастся выделить байт со смещением 1000000 * n и сделать это для n от 1 до 1000000 (я думаю, что может сделать это с помощью mmap), то ОС придется подкрепить это миллионом страницы физической памяти, что-то вроде 4G. Эта физическая память не будет доступна ни для чего другого. Если бы вы распределили байты непрерывно, вам понадобится всего около 1M физической памяти (256 страниц) для вашего миллиона байтов.

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

Теоретически можно представить, что виртуальные адреса 1000000 и 2000000 будут отображаться на одной и той же странице физической памяти, избегая фрагментации. Но на практике и по уважительным причинам отображение виртуальной памяти выполняется постранично. Подробнее об этом можно прочитать здесь: http://en.wikipedia.org/wiki/Page_table.

0 голосов
/ 17 декабря 2011

Поскольку вся эта память «потрачена впустую», рассмотрите приложение, в котором много внутренней фрагментации.Этот процесс требует больше страниц в памяти, потому что рабочий набор теперь разбросан по памяти, а это означает, что его объем памяти намного выше.Если это приложение конкурирует за физические слоты в ОЗУ (на компьютерах все еще на самом деле есть только около 4–8 ГБ ОЗУ для типичной домашней установки), то это вызывает больше подкачки страниц.Как правило, вы хотите уменьшить объем памяти ваших приложений, чтобы избежать нагрузки на память и конфликтов с другими приложениями.

Бывают случаи, когда это не имеет значения, вам не придется тратить лишний мегабайт здесь или там, но все это складывается в более крупные приложения.В зависимости от ситуации важно, насколько важно иметь как можно меньшую фрагментацию, в зависимости от того, что вы кодируете или какова цель вашего проекта.

...