Что такое непрерывный блок памяти? - PullRequest
33 голосов
/ 30 октября 2010

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

Ответы [ 5 ]

53 голосов
/ 30 октября 2010

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

alt text

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

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

alt text

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

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

45 голосов
/ 30 октября 2010

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

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

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

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

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

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

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

5 голосов
/ 30 октября 2010

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

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

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

2 голосов
/ 30 октября 2010

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

2 голосов
/ 30 октября 2010

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

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

См. также Фрагментация .

...