Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Как можно узнать сколько памяти освободила free()?  (Прочитано 1697 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Neiffer

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Всем доброго времени суток. Моя проблема заключается в том, что мне нужно написать подобную версию для функции free() и выводить на экран сколько она освободила памяти при каждом ее вызове. Я не могу понять, КАК это сделать, с malloc все просто размер уже подается в функцию как параметр, а вот как добраться до размера освобождаемой памяти во free() это просто темный лес. :)

Кто нибудь сталкивался с подобной задачей?

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>

void* malloc(size_t size)
{
    static void* (*real_malloc)(size_t) = NULL;
    if (!real_malloc)
        real_malloc = dlsym(RTLD_NEXT, "malloc");

    void *p = real_malloc(size);
    fprintf(stderr, "malloc(%d) = %p\n", size, p);
    return p;
}

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Вопрос не простой - хотя я давно проги на С не писал.
Что юзаете? Какой компилятор?
Если компилятор старый malloc не годится.

andrey_p

  • Гость
Или писать собственный malloc, или использовать непереносимую mallinfo (info mallinfo после apt-get install glibc-doc). ИМО

Оффлайн Neiffer

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Это рабочий маллок уже, проблема тока с free().

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Neiffer,
нафига тебе это всё без понимания принципов работы?
в данном случае сам ты размер не узнаешь.
можешь только трекать какие указатели освобождены
можешь в маллоке запоминать соответствие указателя и размера таким же способом как это делает обычный маллок:
выделять чуть больше и в начале блока записывать инфу возвращать пользователю столько сколько он запросил

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Может ТС лучше на C# перейти - там память не используемая
сама освобождается + прекрасный и простой язык.

Оффлайн RazrFalcon

  • O_o
  • Старожил
  • *
  • Сообщений: 3129
  • Zombie Mod
    • Просмотр профиля
    • Я на GitHub
Может ТС лучше на C# перейти - там память не используемая
сама освобождается + прекрасный и простой язык.
толсто...
Gentoo + KDE, Official Windows Hater
Хотите помочь нашей вики: https://help.ubuntu.ru/wiki/fixme

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Я не могу понять, КАК это сделать, с malloc все просто размер уже подается в функцию как параметр, а вот как добраться до размера освобождаемой памяти во free() это просто темный лес. :)

А никак ;)

1. free() - в Linux это системный вызов free(2) который передаёт ядру задание на освобождение памяти...
2. он может вообще не освобождать никакой памяти + это зависит от того, какой аллокатор (какой алгоритм) памяти (slab, slob, slub, ...) сконфигурирован у вас в ядре.
3. чаще всего, запрос free() к аллокатору slab (обычна ситуация десктопа) как раз и не будет реально осуществлять освобождения (до возникновения переразметки пула памяти, с которым работает аллокатор).

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Olej,
как всегда со своими фантазиями =)
реализации malloc/realloc/free находится в libc и не является как таковым системным вызовом.
ядро предоставляет иные способы управления памятью процесса таке как brk и mmap

man для malloc/realloc/free находятся в секции 3 (библиотеки)

"никак" это плохой ответ. есть способы. см. выше я писал как. тем более всегда можно сделать свой лунапарк написать свой распределитель памяти.

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Olej,
как всегда со своими фантазиями =)
реализации malloc/realloc/free находится в libc и не является как таковым системным вызовом.
ядро предоставляет иные способы управления памятью процесса таке как brk и mmap

man для malloc/realloc/free находятся в секции 3 (библиотеки)

1. malloc/realloc/free находящиеся в libc, управляют памятью в размерах того очень ограниченного хипа, который заранее приставлен к пользовательскому процессу в момент его старта, как только программа начинает по-взрослому работать с памятью (в больших объёмах), так тут же включаются системные запросы для коррекции хипа.

2. printf() тоже ...  "не является как таковым системным вызовом"(с) ;), более того! - man для printf тоже "находится в секции 3"(с) ;).
Ну и? ... - он тут же немедленно через sprintf() ретранслируется в системный write() - всегда и бесповоротно!


Пользователь решил продолжить мысль 24 Марта 2012, 13:50:13:
"никак" это плохой ответ.

"никак" - это очень хороший ответ на такое намерение (я тоже как-то много времени убил на рассмотрение корреляции освобождения памяти в процессе и свободной памятью системы, да ещё и в realtime системе QNX, где всё прозрачнее).

"никак" - означает, что никакие free() в процессе напрямую не связаны с тем, сколько свободной памяти известно в системе - это всё игрища процесса со своим собственным хипом (это как котёнок охотится за своим хвостом).
« Последнее редактирование: 24 Марта 2012, 13:50:13 от Olej »

 

Страница сгенерирована за 0.036 секунд. Запросов: 25.