Как исправить размер памяти для моего приложения в C? - PullRequest
5 голосов
/ 19 июня 2009

Я хотел бы выделить фиксированную память для моего приложения (разработанного с использованием C). Скажем, мое приложение не должно превышать 64 МБ памяти. А также я должен избегать использования большего количества процессоров. Как это возможно?

С уважением Марсель.

Ответы [ 5 ]

4 голосов
/ 19 июня 2009

Под unix: "ulimit -d 64M"

3 голосов
/ 19 июня 2009

Если вы работаете с POSIX, System V или BSD, вы можете использовать setrlimit() с ресурсом RLIMIT_DATA - аналогично ulimit -d.

Также взгляните на ресурс RLIMIT_CPU - это, вероятно, то, что вам нужно (похоже на ulimit -t)

Проверьте man setrlimit для деталей.

3 голосов
/ 19 июня 2009

Один довольно технологичный способ, который я мог бы обеспечить, чтобы не превышать максимальный порог памяти в вашем приложении, - это определить собственную специальную функцию malloc(), которая хранит счет того, сколько памяти было выделено, и возвращает указатель NULL. если порог был превышен. Это, конечно, будет зависеть от того, что вы проверяете возвращаемое значение malloc() каждый раз, когда вы его вызываете, что в любом случае считается хорошей практикой, поскольку нет гарантии, что malloc() найдет непрерывный блок памяти того размера, который вы запрашивали. .

Это не было бы надежно, потому что, вероятно, не будет учитываться заполнение памяти для выравнивания слов, поэтому вы, вероятно, в конечном итоге достигнете предела памяти в 64 МБ задолго до того, как ваша функция сообщит, что достигла его.

Кроме того, если вы используете Win32, возможно, есть API, которые вы могли бы использовать, чтобы получить текущий размер процесса и проверить это в своей пользовательской функции malloc(). Имейте в виду, что добавление этих проверочных накладных расходов в ваш код, скорее всего, заставит его использовать больше ресурсов ЦП и работать намного медленнее, чем обычно, что приятно приводит к следующему вопросу:)

А также я должен избегать использовать больше Загрузка процессора.

Это очень общий вопрос, и на него нет простого ответа. Вы можете написать две разные программы, которые, по сути, делают одно и то же, и одна из них может быть в 100 раз больше загружать процессор, чем другая из-за используемых алгоритмов. Лучшая техника для:

  1. Установите некоторые показатели производительности.
  2. Напишите вашу программу.
  3. Измерьте, чтобы увидеть, достигает ли он ваших ориентиров.
  4. Если оно не достигает ваших ориентиров, оптимизируйте и перейдите к шагу (3).

Вы можете использовать программы профилирования, чтобы помочь вам понять, где ваши алгоритмы должны быть оптимизированы. Rational Quantify является примером коммерческого, но есть также много бесплатных профилировщиков.

1 голос
/ 19 июня 2009

Для процессора у нас была задача с очень низким приоритетом (ниже, чем все остальное), которая ничего не делает, кроме как считает. Затем вы можете увидеть, как часто эта задача запускается, и вы знаете, что остальные процессы потребляют слишком много ресурсов процессора. Этот подход не работает, если вы хотите ограничить ваш процесс до 10% во время работы других процессов, но если вы хотите, чтобы у вас было 50% свободного ЦП, тогда он работает нормально.

Из-за ограничений памяти вы либо застряли, реализуя свой собственный слой поверх malloc, либо каким-то образом воспользовались своей ОС. В системах Unix ulimit - ваш друг. На VxWorks, я уверен, вы могли бы найти способ воспользоваться блоком управления задачами, чтобы увидеть, сколько памяти использует приложение ... если функции для этого еще нет. В Windows вы, вероятно, могли бы по крайней мере настроить монитор для отчета, если ваше приложение превышает 64 МБ.

Другой вопрос: что вы делаете в ответ? Должно ли ваше приложение зависать, если оно превышает 64 Мб? Вы хотите это просто как руководство, чтобы помочь вам ограничить себя? Это может иметь значение между выбором «принудительного» подхода и подхода «мониторинга и отчета».

0 голосов
/ 19 июня 2009

Хм; хороший вопрос. Я могу видеть, как вы могли бы сделать это для памяти, выделенной из кучи, используя пользовательскую версию malloc и free, но я не знаю и о принудительном применении этого в стеке.

Управление процессором еще сложнее ...

Интересно.

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