Системное программное обеспечение персональных ЭВМ

Функции pаспpеделения памяти DOS


12.2. Функции pаспpеделения памяти DOS

При обычной работе MS DOS сама занимается распределением памяти и предоставляет пользователю три функции выделения/освобождения памяти:

  • функция 0x48 - выделение блока памяти (на входе: BX - требуемый размер блока в параграфах, на выходе: AX - сегментный адрес выделенного блока; если памяти для удовлетворения запроса не хватает, BX содержит размер наибольшего свободного блока);
  • функция 0x49 - освобождение блока (на входе ES - сегментный адрес освобождаемого блока);
  • функция 0x4A - изменение размера ранее выделенного блока (на входе ES - сегментный адрес, BX - требуемый размер).

Для всех функций ненулевое состояние флага CY является признаком ошибки.

Следующий программный пример иллюстрирует работу системы по выделению/освобождению памяти.

Функция init производит сканирование цепочки MCB и определяет адрес последнего блока памяти freetop. При принятой в системе по умолчанию дисциплине распределения памяти старшие адреса памяти представляют собой большой свободный блок, и все последующие выделения памяти будут вестись за счет этого свободного блока.

Функция memmap перебирает цепочку MCB, начиная с адреса freetop и выдает карту распределения памяти от freetop до конца памяти.

Функции memget, memfree, memnew обеспечивают обращения к функциям DOS 0x48, 0x49, 0x4A соответственно.

При шагах 1-5 программы происходит выделение нескольких блоков памяти по 64 параграфа каждый. По изменению карты памяти при этих шагах можно видеть, что новый блок памяти выделяется в начале свободного большого блока. Для оставшейся части большого блока система строит новый MCB, в котором этот блок помечается как свободный.

На шаге 5 изменяется (уменьшается) размер блока a2. По карте памяти мы увидим, что блок a2 будет разбит на два блока: первый - занятый блок требуемого размера, а освободившаяся часть блока образует новый, свободный блок.

На шаге 6 выдается запрос на увеличение блока a2 до размера большего 64 параграфов. Этот запрос не может быть удовлетворен, так как размер блока может быть увеличен только в том случае, если за ним следует свободный блок достаточного размера. В нашем случае блок a2 будет увеличен до возможного размера (64 параграфов), и будет индицирована ошибка.

Из карты, выдающейся на шагах 7, 8 видно, что при освобождении блока, в его MCB появляется отметка "свободен", при освобождении возможно появление фрагментации памяти.

При поступлении запроса на блок большего размера (шаг 9), этот блок выделяется за счет последнего свободного блока, как и на шагах 1 - 5.

При поступлении запроса на блок меньшего размера (шаг 10), этот блок выделяется за счет свободного блока внутри цепочки (в нашем случае - за счет блока a1. При этом, если затребованный размер меньше размера свободного блока, выделяется затребованный объем памяти, а остаток образует свободный блок.



Содержание раздела