Что такое непрерывный блок памяти?
Как и в заголовке, что такое непрерывный блок памяти?
5 ответов
Один без пробелов в адресах, которые он занимает. Вы, вероятно, можете просто думать об этом как о "блоке" и думать о чем-то с промежутком в середине как "два блока".
Термин появляется в определении массива как "смежный". Это означает, что элементы располагаются вплотную, без разрывов и отступов между ними (внутри каждого элемента может быть заполнение, но не между элементами). Таким образом, массив из 5 4-байтовых элементов выглядит следующим образом (1 знак подчеркивания на байт, символы | не представляют память):
____ ____ ____ ____ ____
|____|____|____|____|____|
Это не выглядит так:
____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|
И при этом это не выглядит так:
____ ____ ____ ____ ____
|____|____|____| ... somewhere completely different ... |____|____|
Во всех случаях "выглядит как" означает "что касается адресов, видимых в C". Что-то может быть смежным в виртуальном адресном пространстве, но не смежным в физической ОЗУ. В этом отношении что-то может быть смежным в физическом адресном пространстве ОЗУ, но фактически не смежным в физической ОЗУ. Половина может быть на одном чипе ОЗУ, а другая половина на другом чипе. Но модель памяти C не может "видеть" ничего из этого.
Это непрерывный блок памяти из пяти байтов, охватывающий от местоположения 1 до местоположения 5:
Он представляет байты (окрашенные в светло-голубой), которые находятся вместе в памяти без промежутков байтов (белого) между ними.
Это несмежный набор из пяти байтов:
Он разбит на три группы байтов (желтого цвета) с байтами разрыва в точках 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 байта.
Смотрите также Фрагментация.
Память состоит из большого количества блоков байтов. У каждого блока есть свой адрес. Когда процесс запрашивает память, память выделяется двумя способами:
- Непрерывное распределение памяти
- Распределение несмежной памяти
При непрерывном распределении памяти назначаются последовательные (один за другим) блоки, которые называются непрерывными блоками памяти.
При распределении несмежной памяти назначаются отдельные блоки, находящиеся в разных местах.