Разделение кучи на 64-битной земле

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

Это проблема с 64-разрядным адресным пространством? Perf не заботится обо мне, поэтому я бы предпочел упростить свой код и больше не заниматься такими вещами, как пулы буферов. Есть ли у кого-нибудь опыт или рассказы об этой проблеме? Я использую Linux, но думаю, что многие из тех же проблем относятся к Windows.

Ответы

Ответ 1

Это еще проблема с 64-разрядным адресным пространством?

Нет, это еще не проблема.

Вы правы, что это проблема для 32-разрядных систем, но это больше не проблема в 64-разрядных системах.

Виртуальное адресное пространство настолько велико в 64-битных системах (2 ^ 48 байт в настоящее время на сегодняшних процессорах x86_64 и постепенно увеличивается до 2 ^ 64 при выходе новых процессоров x86_64), что заканчивается смежными виртуальное адресное пространство из-за фрагментации практически невозможно (для всех, кроме некоторых очень надуманных угловых случаев).

(Это обычная ошибка интуиции, вызванная тем, что 64 "только" double 32, что заставляет людей думать, что 64-разрядное адресное пространство примерно так же удваивает 32-битное. Фактически, полный 64-разрядное адресное пространство в 4 миллиарда раз больше, чем 32-разрядное адресное пространство.)

Положите другой способ, если понадобилось, чтобы ваш 32-разрядный демон на одну неделю фрагментировался до стадии, где он не мог выделить блок байтов x, чем это потребовало бы минимум тысяча лет, чтобы фрагментировать сегодняшние x86_64 процессоры 48-битными адресными пространствами, и потребовалось бы 80 миллионов лет для фрагментации будущего запланированного полного 64-разрядного адресного пространства.

Ответ 2

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

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

Единственный способ, которым может помочь 64-разрядная ОС, - это иметь достаточно большой объем памяти, который бы никогда не фрагментировал его.

Ответ 3

Если вашему процессу действительно нужны гигабайты виртуального адресного пространства, то обновление до 64-бит действительно мгновенно устраняет необходимость в обходных методах.

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

(Кстати, Windows является более ограничительной, поскольку она резервирует нечеткое количество адресного пространства в каждом процессе для ОС).