Перераспределение оперативной памяти - Windows и Linux - PullRequest
2 голосов
/ 15 ноября 2009

Я работаю над проектом по оптимизации энергопотребления в системе. Часть этого проекта состоит в выделении оперативной памяти на основе локальности, то есть выделении сегментов памяти для программы как можно ближе друг к другу. Есть ли способ, которым я могу знать, где именно находится расположение памяти, которую я выделяю (микросхемы памяти), и мне также было интересно, можно ли принудительно распределить память. Я заинтересован как в Windows, так и в Linux. Кроме того, проект будет реализован на Java и .NET, поэтому я заинтересован в управляемых API для достижения этой цели.

[Я знаю, что это не может привести к прямому сокращению энергопотребления, но проект должен быть доказательством концепции.]

Ответы [ 8 ]

13 голосов
/ 19 ноября 2009

Вы работаете на неправильном уровне абстракции.

Java (и, предположительно, .NET) относится к объектам, использующим дескрипторы, а не необработанные указатели. Базовая Java VM может перемещать объекты в виртуальной памяти в любое время; Java-приложение не видит никакой разницы.

Приложения Win32 и Linux (такие как Java VM) обращаются к памяти, используя виртуальные адреса. В микросхеме ОЗУ происходит сопоставление виртуального адреса с физическим адресом. Ядро может изменить это отображение в любое время (например, если данные переносятся на диск, а затем считываются в другую область памяти), и приложения не видят никакой разницы.

Так что, если вы используете Java и .NET, я бы не стал менять ваше приложение Java / .NET для достижения этой цели. Вместо этого я бы изменил ядро ​​Linux или, возможно, Java VM.

Для прототипа одним из подходов может быть загрузка Linux с параметром mem =, чтобы ограничить использование памяти ядром меньшим, чем объем вашей памяти, а затем посмотреть, можете ли вы отобразить запасную память (возможно, путем отображения dev / mem как root?). Затем вы можете изменить все вызовы malloc () в виртуальной машине Java, чтобы использовать свой собственный специальный распределитель памяти, который выделяет из этого свободного пространства.

Для реальной реализации этого вы должны сделать это, изменив ядро ​​и сохранив совместимость с пользовательским пространством. Посмотрите на работу, проделанную в оперативном подключении к памяти в Linux , например. http://lhms.sourceforge.net/

2 голосов
/ 23 ноября 2009

Если вы хотите попробовать это на языке с большой средой выполнения, вам придется настроить реализацию этой среды выполнения или написать DLL / общий объект, чтобы сделать все управление памятью для вашего примера приложения. В этот момент общее поведение системы вряд ли будет похоже на обычную работу этих сред выполнения.

Простейшая, самая чистая тестовая среда для выявления (возможно, небольших) преимуществ локальности ссылок была бы в C ++ с использованием пользовательских распределителей. Эта среда удалит несколько потенциальных причин шума в данных времени выполнения (в основном, сборщик мусора). Вы также потеряете все энергопотребление, связанное с запуском CLR / JVM или поддержанием его рабочего состояния - что, вероятно, также будет приветствоваться в проекте по минимизации энергопотребления. Естественно, вы захотите дать тестовому приложению процессорное ядро ​​для устранения шума переключения потоков.

Написание собственного распределителя, чтобы дать вам один из предварительно выделенных блоков на вашей текущей странице, не должен быть слишком сложным, но, учитывая, что для достижения локальности ссылок в C / C ++ вы обычно просто используете стек, который вряд ли будь тем, кого сможешь найти, скачать и использовать.

1 голос
/ 19 ноября 2009

Является ли предварительное распределение большими блоками (чем необходимо) вообще вариантом? Будет ли это победить первоначальную цель?

1 голос
/ 15 ноября 2009

В C / C ++, если вы приведете указатель на int, это сообщит вам адрес. Однако в Windows и Linux это виртуальный адрес - операционная система определяет отображение на физическую память, а блок управления памятью в процессоре выполняет его.

Итак, если вас волнует, где ваши данные находятся в физической памяти, вам придется спросить у ОС. Если вам просто интересно, находятся ли ваши данные в одном и том же блоке MMU, проверьте документацию операционной системы, чтобы узнать, какой размер блоков он использует (4 КБ обычно для x86, но я слышал, что в наши дни дети играют с 16M гигантскими блоками?). 1005 *

Java и .NET добавляют третий слой к смеси, хотя, боюсь, я не могу вам помочь.

0 голосов
/ 22 ноября 2009

Это интересная тема, хотя я думаю, что она выходит за рамки возможностей управляемых языков, таких как Java или .NET. Одним из главных принципов этих языков является то, что вы не должны управлять памятью, и, следовательно, они абстрагируют это для вас. C / C ++ дает вам лучший контроль с точки зрения фактического выделения этой памяти, но даже в этом случае, как упоминалось ранее, операционная система может делать некоторые помахивания руками и косвенное распределение памяти, что затрудняет определение того, как вещи распределяются вместе. Даже тогда вы ссылаетесь на настоящие чипы, это еще сложнее, и я думаю, что это будет зависеть от аппаратного обеспечения. Я серьезно подумал бы об использовании платы для создания прототипов, где вы можете кодировать на уровне сборки и фактически контролировать каждый блок памяти явно без какого-либо вмешательства со стороны оптимизации компилятора или практики обеспечения безопасности операционной системы. Это дало бы вам наиболее значимые результаты, так как дало бы вам возможность контролировать каждый аспект программы и точно определять, что любые улучшения энергопотребления связаны с вашим алгоритмом, а не с невидимой оптимизацией, выполняемой компилятором или операционной системой. Я полагаю, что это какой-то исследовательский проект (очень интригующий), поэтому потратить ~ 100 долларов на макетную плату, по моему мнению, стоило бы.

0 голосов
/ 21 ноября 2009

Подход требует специализированного оборудования. В обычных картах памяти и слотах устройства спроектированы таким образом, чтобы рассеивать тепло даже на чип. Например, 1 бит в каждом слове шины на физический чип.

0 голосов
/ 19 ноября 2009

В .NET имеется интерфейс COM, доступный для профилирования приложений .NET, который может предоставить вам подробную информацию об адресе. Я думаю, что вам нужно будет объединить это с некоторыми вызовами в ОС для перевода виртуальных адресов.

Поскольку zztop исключен, .NET CLR сжимает память каждый раз, когда выполняется сборка мусора. Хотя для крупных объектов они не уплотнены. Это объекты в куче больших объектов. Куча больших объектов может состоять из множества сегментов, разбросанных от вызовов ОС к VirtualAlloc.

Вот несколько ссылок на API профилирования:

0 голосов
/ 15 ноября 2009

Я думаю, что если вы хотите такого приливного управления распределением памяти, вам лучше использовать скомпилированный язык, такой как C, JVM, для изоляции фактической реализации языка от аппаратного обеспечения, включая выбор микросхем для хранения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...