|
Новости |
ФРАГМЕНТАЦИЯКогда блоки доступной памяти располагаются между участками распределенной памяти, то говорят, что происходит фрагментация памяти. Хотя свободной памяти как правило бывает достаточно, что- бы удовлетворить запрос памяти, однако трудность заключается в том, что размеры отдельных участков свободной памяти недостаточны для этого, несмотря на то, что при их объединении получится дос- таточный объем памяти. На рис.18 показано, как при определенной последовательности обращения к процедурам "New" и "Dispose" может возникнуть такая ситуация. Когда блоки доступной памяти располагаются между участками распределенной памяти, то говорят, что происходит фрагментация памяти. Хотя свободной памяти как правило бывает достаточно, что- бы удовлетворить запрос памяти, однако трудность заключается в том, что размеры отдельных участков свободной памяти недостаточны для этого, несмотря на то, что при их объединении получится дос- таточный объем памяти. На рис.18 показано, как при определенной последовательности обращения к процедурам "New" и "Dispose" может возникнуть такая ситуация. A,B,C,D:^integer W,X,Y,Z:^real; +-----------------------------------------+ new(A) ¦ A ¦ ¦ +-----------------------------------------+ +-----------------------------------------+ new(W) ¦ A ¦ W ¦ ¦ +-----------------------------------------+ +-----------------------------------------+ new(B) ¦ A ¦ W ¦ B ¦ ¦ +-----------------------------------------+ +-----------------------------------------+ new(C) ¦ A ¦ W ¦ B ¦ C ¦ ¦ +-----------------------------------------+ +-----------------------------------------+ new(X) ¦ A ¦ W ¦ B ¦ C ¦ X ¦ ¦ +-----------------------------------------+ +-----------------------------------------+ new(Y) ¦ A ¦ W ¦ B ¦ C ¦ X ¦ Y ¦ ¦ +-----------------------------------------+ +-----------------------------------------+ dispose(B)¦ A ¦ W ¦ ¦ C ¦ X ¦ Y ¦ ¦ +-----------------------------------------+ new(Z) Запрос не может быть удовлетворен, поскольку нет участка непрерывной свободной памяти доста- точного размера В некоторых случаях фрагментация уменьшается, так как функ- ции динамического распределения памяти объединяют соседние участ- ки памяти. Например, пусть были выделены участки памяти A,B,C,и D /см. ниже/. Затем освобождаются участки B и C. Эти участки можно объединить, поскольку они располагаются рядом. Однако, если осво- бождаются участки B и D, то объединить их нельзя будет, поскольку между ними находится участок C который еще не освобожден: ________________________ ¦ ¦ ¦ ¦ ¦ ¦ A ¦ B ¦ C ¦ D ¦ ¦_____¦_____¦_____¦_____¦ Так как B и D освобождены, а C занят, то может возникнуть вопрос: "Почему бы Турбо Паскалю не переслать содержимое C в D и затем объединить B и C?" Трудность заключается в том, что ваша программа не будет "знать", что это пересылка произошла. Один из способов предотвращения большой фрагментации заклю- чается в том, чтобы всегда выделять одинаковые участки памяти. В этом случае все освобожденные участки могут использоваться при любых последующих запросах на выделение памяти и таким образом будет использована вся свободная память. Если нельзя использовать всегда одинаковый размер выделяемых участков, то следует ограни- читься только несколькими размерами. Иногда этого можно достиг- нуть путем объединения нескольких запросов на выделение небольших участков в один запрос на выделение одного большого участка памя- ти. Не следует для предотвращения фрагментации выделять больше памяти, чем действительно требуется, поскольку получаемая выгода не окупит потерь от неиспользованной памяти. Можно использовать другой подход к решению этой проблемы: при работе программы можно записывать информацию во временный дисковый файл, освободить всю память и затем считать информацию с диска в память. При считыва- нии информации не будет создаваться никаких промежутков. |
(с)Все права защищеныПо всем интересующим вопросампрошу писать на электронный адрес |