Фрагментация памяти в куче
388 |
Глава 14. Управление подпрограммами |
мелкие области. В конце концов, наступит момент, когда менеджер распределения памяти не сможет удовлетворить запрос на блок из N слов, поскольку не окажется ни одного достаточно большого блока, хотя в целом список свободного пространства содержит гораздо больше, чем N слов свободной памяти. В итоге, из-за нехватки свободной памяти выполнение программы останавливается задолго до того, когда на самом деле исчезнут ресурсы памяти. Таким образом, возникает потребность дефрагментации кучи: объединения свободных блоков в блоки большего размера. Возможны два подхода к дефрагментации: 1. Частичная дефрагментация. Если активные блоки кучи нельзя перемещать (или перемещение обходится слишком дорого), то можно объединять только смежные блоки из списка свободного пространства. 2. Полная дефрагментация. Если активные блоки можно перемещать, тогда все активные блоки перемещаются в один конец кучи, а все свободное пространство оказывается сосредоточенным на другом конце, в одном непрерывном блоке. Полная дефрагментация подразумевает, что при перемещении активного блока все указатели на него модифицируются нужным образом и способны указать на его новое местоположение. |