2016-05-29 2 views
0

Я создаю драйвер пользовательской стороны CMA (Contiguous Memory Allocator), и я смоделировал некоторую область пространства. Если я создам второй объект, который хочет mmap в той же области памяти, можно ли выполнить поиск, что он уже был mmaped и передать этот адрес? В настоящее время каждый объект будет создавать свой собственный mmap, он работает, но это хорошая идея с точки зрения производительности?Совместное использование MMAP для нескольких объектов

Класс используется для mmap различных областей памяти, в зависимости от того, что передается в конструкторе, поэтому статический не работает.

+0

«Это хорошая идея с точки зрения производительности?» Почему бы не измерить это? –

+0

измерение против чего? У меня пока нет альтернативных методов :) – user1876942

+0

mmapping он дважды против mmapping его один раз и повторное использование mmap. –

ответ

0

Я не уверен на 100%, чего вы хотите достичь, но я предполагаю, что вы хотите оптимизировать распределение, чтобы получить меньше накладных расходов, если один и тот же регион используется несколько раз в одном приложении.

Ядро должно отслеживать каждую ссылку на страницу физической памяти, поэтому, если вы «отслеживаете выделение и возвращаете один и тот же указатель» в свой код, вам нужно будет ссылаться на подсчет ассигнований самостоятельно и выполнять только распределение/когда это необходимо.

Я хотел бы выполнить, что на уровне пользовательского режима, в основном сохраняя std::map (или аналогичный), который вводится в основной памяти и размера, а затем подсчет ссылок, что распределение, и вызывать только munmap, когда счетчик ссылок достигает нуля (и, конечно, только позвонить mmap, когда регион не найден). Это становится более «забавным», если у вас есть несколько распределений разных размеров для одного и того же региона, но я не думаю, что есть способ, который работает (хорошо), который может быть реализован для этого - по крайней мере, нет, если второй вызов требует более крупное распределение.

Преимущество этого в пользовательском режиме ясно: если вы когда-либо ошиблись в бухгалтерском учете, ядро ​​все равно освободит память, если приложение остановится. И распределение памяти для std::map [или его эквивалента] в режиме ядра также будет намного сложнее иметь дело.

+0

Это то, что я думал. Я оставлю его для пользователя моего драйвера, чтобы поддерживать уже отображенные адреса и подсчеты. – user1876942

Смежные вопросы