Что такое непрерывный блок памяти?

Как и в заголовке, что такое непрерывный блок памяти?

Ответ 1

Один без пробелов в адресах, которые он занимает. Вероятно, вы можете просто подумать об этом как о "блоке" и подумать о чем-то с промежутком посередине как "двух блоков".

Термин появляется в определении массива как "смежный". Это означает, что элементы выложены из конца в конец, без разрывов и без прокладки между ними (внутри каждого элемента может быть прокладка, но не между элементами). Таким образом, массив из 5 4-байтных элементов выглядит следующим образом (1 символ подчеркивания на каждый байт, символы | не представляют память):

 ____ ____ ____ ____ ____
|____|____|____|____|____|

Это не выглядит так:

 ____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|

И также не выглядит так:

 ____ ____ ____                                           ____ ____
|____|____|____| ... somewhere completely different ...  |____|____|

Во всех случаях "похоже" означает "насколько это касается адресов, видимых на C". Что-то может быть смежным в виртуальном адресном пространстве, но не смежным в физической ОЗУ. В этом случае что-то может быть смежным в адресном пространстве физического RAM, но фактически не смежным в физической ОЗУ. Половина из них может быть на одном чипе RAM здесь, а другая половина на другом чипе RAM там. Но модель памяти C не может "видеть" что-либо из этого.

Ответ 2

Это смежный блок памяти из пяти байтов, охватывающий от местоположения 1 до местоположения 5:

alt text

Он представляет байты (синим цветом), которые вместе находятся в памяти без пробелов (белый) между ними.

Это непересекающийся набор из пяти байтов, представляющих интерес:

alt text

Он фрагментирован на три группы байтов (желтый), начиная с местоположения 1 с байтами пробела, присутствующими между группами. Байты пробела находятся в точках 4 и 6.

Ответ 3

Блок памяти, который не прерывается другой памятью. Точнее, для этого требуется непрерывный блок виртуального адресного пространства. Реальная ОЗУ, поддерживающая это адресное пространство, не должна быть непрерывной.

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

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

Ответ 4

Отвечая в контексте выделения памяти, когда вы вызываете распределитель памяти и запрашиваете 24 байта памяти, он должен иметь возможность находить один блок по меньшей мере из 24 байтов нераспределенной памяти.

Если у него есть 16 байт памяти, начиная с одного адреса x и еще 8 байтов, начинающихся с адреса y таким образом, что y > x + 16 или y < x - 8 (что создаст пробел), тогда распределитель не может удовлетворить ваш запрос на 24 байта, хотя в общей сложности 24 байта.

См. также Fragmentation.

Ответ 5

Блок памяти смещен точно, когда он определяется начальным и конечным адресами из одного линейного адресного пространства и не имеет отверстий.