В виртуальной системе памяти виртуальное адресное пространство означает, что виртуальные страницы могут отображаться в любом месте. Вам не нужны большие смежные блоки физической памяти. Если у вас возникли проблемы с фрагментацией вашего виртуального адресного пространства, вам может потребоваться другая стратегия управления памятью.
Однако большинство вариантов потребует, чтобы ваш код приложения знал о стратегии управления памятью на определенном уровне. Я не верю, что есть быстрое решение этой проблемы - вы, вероятно, готовы к серьезной операции по ее устранению. Ни один из этих вариантов не прост в реализации, вам придется найти тот, который, скорее всего, будет работать в вашем конкретном случае.
Основными параметрами, которые я могу видеть, являются: пользовательские распределители памяти, что-то, что связано с AWE (см. Ниже) или перестраивает стратегию распределения памяти в приложении.
Вариант 1: Пользовательские памяти распределители
распределители Пользовательские памяти не являются редкостью в кругах C и C++. Возможно, вы сможете реализовать нечто подобное. Две возможностей открыты для вас:
Построить Распределитель памяти с механизмом, который пытается объединить соседние свободные блоки в один большой блок (вы можете запустить это как часть пытается оправиться от неудачного выделения памяти). Это может позволить вам прозрачно управлять памятью, если приложение не должно быть известно. Реализация этого будет сложной и технической, но, вероятно, возможна.
Главное преимущество этого подхода состоит в том, что он является единственным, который не требует от вас изменения существующего кода приложения. Недостатком является то, что он не гарантированно работает; все же возможно, что операция слияния может не консолидировать блок памяти, достаточно большой для выполнения запроса. Операция слияния также может привести к значительным паузам в ответе приложения во время его запуска.
Возможно, вам потребуется создать приложение таким образом, чтобы можно было уплотнять структуру данных. Это потребует от вас поддержки дескрипторов, которые поддерживают перемещаемые объекты, т. Е. Механизм двойной косвенности. Я предполагаю, что существует, вероятно, одно или довольно небольшое количество различных структур данных, которые вызывают эту проблему фрагментации, поэтому можно установить в любую другую работу по реорганизации в вашем приложении.
Вариант 2: PAE
Windows, делает средство поддержки непосредственно манипулировать MMU, и есть несколько возможностей, где это может относиться к вашему приложению. Это, безусловно, потребует явной поддержки архитектуры от вашего приложения, но дает возможность использовать пул памяти, который намного превышает 2 ГБ.
На серверных версиях Windows просмотрите PAE, который поддерживается API's, что позволяет вам вручную манипулировать MMU системы и переквалифицировать куски памяти. Это может быть полезным для вас в один из двух способов
Вы можете построить менеджер для структуры данных, таким образом, что использует этот механизм в качестве неотъемлемой части управления данными.
Если вы можете поместить элементы в своей структуре данных на границы страниц, вы можете использовать это как способ консолидации памяти.
Однако такой подход потребует от вас реорганизовать ваше приложение таким образом, что ссылки на объект имел достаточно информации для управления процессом явного подкачки в (возможно, своего рода наложения менеджера с механизмом прокси для объектов, с помощью этой системы). Это означает, что любое решение, включающее PAE, не является заменой для FastMM - вам нужно будет изменить приложение, чтобы явно поддерживать PAE.
Однако прокси-механизм такого рода может означать, что эта подсистема может быть относительно прозрачной для клиентов. Помимо накладных расходов на управление косвенностью и оверлеями (что может быть или не быть существенной проблемой) прокси могут быть практически неотличимы от оригинального API. Такой подход будет работать лучше всего для относительно небольшого количества крупных и тяжелых объектов с минимальным взаимосоединением - каноническое приложение для этого - кэширование диска. Прокси должны были оставаться в фиксированном месте в памяти, причем более крупные объекты просматривались через механизм наложения. YMMV.
Вариант 3: Исправлена проблема в источнике
Одной из возможностей является то, что ваша стратегия распределения объекта может быть оптимизирована из кода приложения (возможно, из пулов объектов, выделенных в объеме, а затем управлять из приложения). Это может позволить вам иметь дело с фрагментацией памяти из вашего приложения, не пытаясь переписать диспетчер памяти.
Опять же, этот подход означает, что вам придется перестроить части вашего приложения, а применимость подхода действительно зависит от характера вашего приложения. Только вы можете быть судьей, насколько хорошо это может сработать.
Небольшая коррекция: в 64-битных версиях ОС вы получить полный диапазон адресов 4 ГБ для 32-битных процессов. Возможно, этот процесс не сможет его использовать (из-за того, что используемые типы подписей используются в программах управления памятью), но предел отличается от 32-разрядной ОС. У AFAIR Delphi * есть проблемы с этим. – mghie
Да, delphi использует множество знаковых значений везде в RTL –