>Всегда были проблемы при работе с памятью, и сейчас возник следующий вопрос. Изучайте матчасть и закрывайте пробелы.
>У меня в программе на Си в Linux'е используется динамический список.
переходите на с++ что ли, уже 2009 год на дворе и эта ваша фраза как-то пугает, видимо наследуемый код, если нет, то страшно..
>Соответственно есть два потока: один добавляет в список записи, другой их
>обрабатывает и удаляет. Для выделения/очистки памяти используется *alloc/free.
есть тулза от гугла (google perf tools или как-то так) которая подменяет стандартный malloc на свою реализацию заточеную под очень частое выделение/удаление памяти. Это типо для борьбы с дефрагментацией :)
>Добавление происходит быстрей
>удаления, что естественно ведет к постоянному росту списка, что в конечном
>счете может привести к переполнению памяти. Соответственно вопрос, как этого избежать?
сливать в свап и увеличивать свап, добавить озу, еще добавить озу, юзать темповые файлы, и в конце концов если есть возможность свободно менять код - переписать дизайн.
>Можно ли, например, задать программе (внутри самой программы) какое-то ограничение на
>объем доступной памяти, и при этом, соответственно, определить момент, когда этот
>предел будет достигнут (в этом случае можно было бы делать паузу
>и ждать, пока снова не появится достаточно доступной памяти)?
легко, можно даже снаружи перед запуском задать объем памяти для процесса:
man ulimit ключ -v
дальше если malloc вернет NULL, значит не может выделить, пора возвращать выделенное =)
внутри программы системными вызовами getrlimit, getrusage, setrlimit.
>Кроме того, я пытался использовать процессы вместо потоков и разделяемую память, но
>в этом случае ограничение на объем доступной разделяемой памяти оказался слишком
>маленький (не то 32Мб, не то 64). Может кто-нибудь знает, как
>увеличить это ограничение хотя бы до 2Гб?
видимо ulimit -l :)
>
>И забыл сказать. Программа написана под Red Hat Enterprise Linux 3.0 (ядро
>linux 2.4.21)
достаточно ядра, редкая софтина юзает особые уличный фичи всяких энтерпрайзов и т.п. :)