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

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

5 ответов


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

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

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

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

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

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

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

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


это непрерывный блок памяти из пяти байтов, начиная с положения 1 в положение 5:

alt text

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

Это несмежный набор из пяти интересующих байтов:

alt text

Он фрагментирован на три группы байтов (окрашен в желтый цвет) с байтами разрыва в местах 4 и 6. Начиная с местоположения 1 есть цельный блок из трех байтов, начиная с локаций 1 до 3. Есть еще два блока по одному байту каждый в местах 5 и 7, соответственно.

неиспользуемый блок в местоположении 0, а также любые последующие блоки за пределами местоположения 7 обычно можно игнорировать, поскольку они вставляются между байтами, представляющими интерес, охватывая от местоположений 1 до 7.


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

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

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


ответ в контексте выделения памяти при вызове распределителя памяти и запросе 24 байтов памяти он должен иметь возможность найти один блок не менее 24 байтов нераспределенной памяти.

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

см. также фрагментации.


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