Как уменьшить объем памяти IOKit резервов при запуске процесса? - PullRequest
11 голосов
/ 27 июня 2011

Я разработчик, работающий над очень большим 32-битным приложением, интенсивно использующим память.Недостаток виртуального адресного пространства (памяти) является для нас проблемой.Во время моего исследования некоторых недавних проблем я заметил большой кусок памяти, зарезервированный IOKit (512 МБ).Эта память не выделена, а только зарезервирована.Дальнейшие исследования показали, что большинство приложений (Safari, iTunes и т. Д.) Также резервируют этот кусок памяти.Кажется, остается нераспределенным.Я использую vmmap для тестирования.Например, вот приложение Cocoa, созданное с использованием XCode с использованием шаблона по умолчанию:

REGION TYPE                      VIRTUAL
===========                      =======
CG backing stores                  1008K
CG image                              4K
CG raster data                       64K
CG shared images                   2252K
Carbon                             7264K
CoreGraphics                         16K
IOKit (reserved)                  512.0M        reserved VM address space (unallocated)
MALLOC                             59.0M        see MALLOC ZONE table below
MALLOC guard page                    48K
MALLOC metadata                     348K
Memory tag=242                       12K
STACK GUARD                        56.0M
Stack                              8712K
VM_ALLOCATE                        16.2M
__DATA                             8296K
__IMAGE                            1240K
__LINKEDIT                         31.5M
__TEXT                             76.7M
__UNICODE                           536K
mapped file                        27.4M
shared memory                      1320K
===========                      =======
TOTAL                             809.2M
TOTAL, minus reserved VM space    297.2M

Могу ли я что-нибудь сделать, чтобы уменьшить или устранить этот пул памяти?Наше приложение может действительно использовать эти 512 МБ !!!

РЕДАКТИРОВАТЬ: я провел еще несколько исследований, и кажется, что этот кусок памяти является кадровый буфер видеокарты, отображаемый в пространство пользователя.Поэтому я думаю, что более точный вопрос заключается в том, существует ли какой-либо способ ограничения кадрового буфера, занимающего такую ​​большую часть виртуального адресного пространства в пользовательском режиме?IOFBMemorySize.Как показано, если вы выполните эту команду:

ioreg -l | grep IOFBMemorySize

Или вы можете увидеть ее в IORegistryExplorer.Мне не удалось изменить это значение, хотя.Я попытался добавить его в Info.plist для ATIFramebuffer.kext, но ничего хорошего.Я попытался написать программу, которая вызывает IOConnectSetCFProperty, но она вернула kIOReturnUnsupported.

РЕДАКТИРОВАТЬ: после дополнительных исследований кажется, что этот ключ IOFBMemorySize, скорее всего, доступен только для чтения, просто сообщая об объеме памяти, доступной на видеокарте.Похоже, что в Configuration.plist для CoreGraphics есть некоторые интересные значения, но ни одно из них, похоже, не влияет на распределение памяти (даже после перезагрузки).

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

Я думаю, что вы смотрите на это неправильно.

A) IOKit не занимает 512 МБ памяти для буфера кадров.

B) в таблице, которую вы разместили, указано, что reserved VM address space (unallocated), так что, вероятно, это память диска, которая отображается как пространство виртуальной памяти.

C) если у вас не хватает памяти в запущенном приложении, вам нужно по-разному структурировать ее, изучить распределение и утечки и, при необходимости, выполнить кэширование и отложенную выборку.

0 голосов
/ 20 июля 2011

а. Вы пытались запустить это на более слабой графической карте? Так может быть, будет выделено только 128fb? Аппаратные настройки для видеокарты?

б. Использовать внедрение кода для отмены выделения памяти ...

Предполагается, что это ваше личное приложение, которое не использует framebuff и т. Д. И т. Д.
Это, очевидно, не однострочное изменение, но вы можете изменить код, чтобы выделить меньший буфер, или отменить выделение, или разрешить выделение, а затем освободить его (и отменить это во время завершения работы программы) и т. Д. И т. Д.

Могу поспорить, что это можно сделать стабильно

0 голосов
/ 07 июля 2011

по общему признанию, это не ответ на ваш вопрос, но предложение о том, как продолжить ...

Вы пишете, что работаете над очень большим 32-разрядным приложением, поэтому, возможно, сейчас самое время переосмыслить вашу исполняемую архитектуру и разделить очень большое приложение на несколько процессов. может быть, вы хотите упаковать 32-битный код (QT?) в одно приложение (будь то фоновый процесс или графический интерфейс ...), а затем поместить биты с большей интенсивностью памяти и ориентированные на обработку биты во вторичное (64-битное?) приложение. Существует множество разновидностей межпроцессного взаимодействия, и ваше приложение может выиграть от более параллельной архитектуры.

просто идея ... удачи!

| K <</p>

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