Фон: Я разрабатываю мультиплатформенную структуру, которая будет использоваться как база для игры и использования/создания инструмента. Основная идея состоит в том, чтобы иметь пул работников, каждый из которых выполняет свою собственную нить. (Кроме того, рабочие также смогут появляться во время выполнения.) Каждый поток будет иметь свой собственный менеджер памяти.
Я давно думал о создании моей собственной системы управления памятью, и я думаю, что этот проект будет идеальным, чтобы, наконец, попробовать. Я считаю, что такая настройка системы из-за типов использования этой структуры часто требует выделения памяти в реальном времени (игры и инструменты для редактирования текстур).
Проблемы:
-
Нет общеприменимого решения (?). Рамка будет использоваться как для игр/визуализации (а не для AAA, а для инди/воспроизведения) и создания инструмента/приложения. Я понимаю, что для разработки игр обычно (по крайней мере для консольных игр) выделять большой кусок памяти только один раз в процессе инициализации, а затем использовать эту память внутри менеджера памяти. Но применим ли этот метод в более общем приложении?
В игре вы могли бы теоретически знать, сколько памяти вам понадобятся вашим сценам и ресурсам, но, например, приложение для редактирования фотографий будет загружать ресурсы всех разных размеров... Так что в последнем случае размер динамической памяти более динамической памяти "нужно будет? Это приводит меня к следующей проблеме:
-
Перемещение уже выделенных данных и сохранение действительных указателей. Обычно при распределении в куче вы получите простой указатель на кусок памяти. В пользовательском менеджере памяти, насколько я понимаю, подобный подход заключается в том, чтобы вернуть указатель куда-нибудь свободному в предварительно выделенный фрагмент. Но что произойдет, если предварительно выделенный кусок слишком мал и его нужно изменить или даже дефрагментировать? Данные будут необходимы для перемещения в памяти, а старые указатели будут недействительными. Есть ли способ прозрачно обернуть эти указатели каким-то образом, но по-прежнему использовать их как обычно "вне" управления памятью, как если бы они были обычными указателями на С++?
-
Сторонние библиотеки. Если нет способа прозрачного использования настраиваемой системы управления памятью для всех распределений памяти в приложении, каждая сторонняя библиотека, с которой я связываюсь, будет по-прежнему используйте "старые" распределения памяти ОС внутри страны. Я узнал, что для библиотек часто обнаруживают функции для установки пользовательских функций распределения, которые будут использоваться библиотекой, но не гарантируется, что каждая библиотека, которую я буду использовать, будет иметь эту способность.
Вопросы: Возможно ли и возможно реализовать диспетчер памяти, который может использовать динамический блок памяти? Если да, то как будет работать дефрагментация и изменение размера памяти, не нарушая в настоящее время указатели на использование? И, наконец, как лучше всего реализовать такую систему для работы с сторонними библиотеками?
Я также благодарен за любые связанные с ними материалы для чтения, документы, статьи и многое другое!: -)