Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности

Гостевая книга

От автора

ФРАГМЕНТАЦИЯ 

              Когда блоки  доступной  памяти располагаются между участками
         распределенной памяти,  то говорят,  что происходит  фрагментация
         памяти. Хотя свободной памяти как правило бывает достаточно, что-
         бы удовлетворить запрос памяти,  однако трудность  заключается  в
         том, что размеры отдельных участков свободной памяти недостаточны
         для этого,  несмотря на то, что при их объединении получится дос-
         таточный объем памяти.  На рис.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?" Трудность заключается в том,  что ваша
         программа не будет "знать", что это пересылка произошла.
              Один из  способов предотвращения большой фрагментации заклю-
         чается в том,  чтобы всегда выделять одинаковые участки памяти. В
         этом случае  все  освобожденные  участки могут использоваться при
         любых последующих запросах на выделение памяти  и  таким  образом
         будет использована вся свободная память. Если нельзя использовать
         всегда одинаковый размер выделяемых участков,  то следует ограни-
         читься только  несколькими размерами.  Иногда этого можно достиг-
         нуть путем объединения нескольких запросов на выделение небольших
         участков в один запрос на выделение одного большого участка памя-
         ти. Не следует для предотвращения  фрагментации  выделять  больше
         памяти, чем действительно требуется,  поскольку получаемая выгода
         не окупит потерь от неиспользованной памяти.  Можно  использовать
         другой подход к решению этой проблемы: при работе программы можно
         записывать информацию во временный дисковый файл,  освободить всю
         память и затем считать информацию с диска в память.  При считыва-
         нии информации не будет создаваться никаких промежутков.

(с)Все права защищены

По всем интересующим вопросампрошу писать на электронный адрес

    Rambler's Top100 PROext: Top 1000
    Rambler's Top100 Яндекс цитирования
Hosted by uCoz