Руководство по языку B.Pascal 7


Администратор динамически распределяемой области памяти - часть 2


Примечание: Более подробно об этом рассказывается в Главе 11 "Динамически компонуемые библиотеки".

Алгоритм вторичного выделения сегмента работает следующим образом: при распределении большого блока администратор динами- чески распределяемой области памяти просто выделяет глобальный блок памяти, используя подпрограмму Windows ClobalAlloc. При вы- делении маленького блока администратор динамически распределяемой области памяти выделяет больший блок памяти, а затем делит его на более мелкие блоки (как требуется). При выделении "маленьких" блоков перед тем, как администратор динамически распределяемой области памяти выделит блок глобальной динамически распределяемой памяти (который будет в свою очередь разбит на блоки), повторно используются все доступные мелкие блоки.

Границу между маленькими и большими блоками определяется пе- ременной HeapLimit. По умолчанию она имеет значение 1024 байта. Переменная HeapBlock определяет размер, который использует под- система управления динамически распределяемой областью памяти при выделении блоков для вторичного разбиения. По умолчанию она имеет значение 8192 байта. Изменять эти значения вам незачем, но если вы решите это сделать, убедитесь что HeapBlock имеет значение по крайней мере в четыре раза превышающее HeapLimit.

Переменная HeapAllocFlags определяет значение флагов атрибу- тов, передаваемых GlobalAlloc, когда администратор памяти распре- деляет глобальные блоки. В программе по умолчанию используется значение gmem_Moveable, а в библиотеке - gmem_Moveable + gmem_SSEShure.

Блоки глобальной памяти, выделяемые администратором динами- чески распределяемой области памяти, всегда блокируются непос- редственно после своего выделения (с помощью GlobalLock) немед- ленно после своего выделения и не разблокируются, пока не будут освобождены. Этим обеспечивается, что селекторы (адреса сегмен- тов) блоков не изменяются. В стандартной среде Windows и улучшен- ных режимах процессора 386 фиксированные блоки могут, тем не ме- нее, перемещаться в физической памяти, освобождая место для дру- гих запросов по выделению памяти, поэтому это не ухудшает произ- водительности администратора динамически распределяемой области памяти Borland Pascal. Однако в реальном режиме, если от Windows требуется расширение локальной динамически распределяемой облас- ти, администратор памяти Windows, возможно, не сможет переместить их, чтобы выделить другие блоки. Если ваша прикладная программа использует локальную динамически распределяемую область и должна выполняться в реальном режиме, можно рассмотреть при выделении блоков динамической памяти возможность использования средств распределения памяти, предоставляемых Windows.




- Начало -  - Назад -  - Вперед -