2010-10-30 2 views

ответ

37

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

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

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

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

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

И ни это выглядит следующим образом:

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

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

+1

+1 Хорошая фигура. –

+25

@ Синан: Спасибо, я работаю. –

+2

+1 для этого ответа, классический. –

5

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

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

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

2

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

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

См. Также Fragmentation.

2

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

45

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

alt text

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

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

alt text

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

+17

+1 для ярких иллюстраций :) – Michael

Смежные вопросы