Никак. По крайней мере без танцев с бубном это не представляется возможным. С помощью sbrk(0) можно получить край хипа, и потом, теоретически, можно посчитать его размер...
Всяким алгоритмам умным, которые памяти много аллоцируют, нужно знать, сколько они этой памяти уже позабирали, чтобы иногда чего-нибудь в этой памяти заоптимизировать, например.
У солярки, между прочим, есть структурка pstatus_t в которую из файла /proc/[pid]/status можно считать данные и pstatus_t.pr_brksize будет размером кучи. А в Линуксе такого нет, да?
Да. Портабельного и готового решения нет. Лишь костыли. Можно реализовать обертку вокруг распределителя (malloc, например) и в ней подсчитывать сколько чего выделено.
мониторю размер кучи на солярке и аиксе. Аллокирую память, смотрю размер кучи, освобождаю память. А она не освобождается. Не уменьшается. Только увеличивается если больший объем аллокировать. sbrk(0) точно также себя ведет. Какой механизм у этой кучи?
Блин, я не в силах удержаться .
Но когда я читаю название этой темы...
У меня постоянно проскакивает ассоциация, что ее написал кто-то, кто очень боится линукса .
Сорри за оффтопик.
Надо отправлять поскорее, пока не проснулась моя модераторская совесть и я не удалил собственное сообщение .
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Блин, я не в силах удержаться .
Но когда я читаю название этой темы...
У меня постоянно проскакивает ассоциация, что ее написал кто-то, кто очень боится линукса .
Да не, я всего боюсь Но уже привык. Приходится код проверять на пяти платформах. 3 юникса + linux + winnt. И еще у каждой операционки версии есть... иногда только тоска подкрадывается незаметно и начинает хотеться куда-нибудь от всего этого спрятаться. Последний раз такое было когда стал разбираться с организацией многопоточности и дампом стека потока. Хорошо что появились неотложные дела, и все эти стеки и потоки пришлось отложить в сторону на время
Искать долго не пришлось. Все работает. Только солярис почему-то засунул mallinfo() в libmalloc, тогда как все остальные платформы совершенно правильно сделали это в libc. Ну вот зачем спрашивается сану понадобилось извращаться.
Поспешил я с быстрым ответом. Пьюрифайные билды показали, что в линуксе функция mallinfo() реализована криво. Purify ругается на нее FMR и ABR. А если вызывать раз 30 подряд, то в какой-то момент прога вываливается в кору вот с таким стеком: