Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста, с malloc в shared library, gcc, linux / 25 сообщений из 58, страница 1 из 3
23.07.2016, 14:03
    #39279128
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Не могу понять/нарыть объяснение в потере памяти при использовании malloc в функции, находящейстя в динамически загружаемой библиотеке.

Код: plaintext
1.
2.
uname -a
Linux ws-dbn 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01-17) x86_64 GNU/Linux

Код: plaintext
1.
2.
gcc --version
gcc (Debian 4.9.2-10) 4.9.2

Псевдокод
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
// in lib.so:
// var. 1
void *db_thread(void *)
{
	char c[100];
	sleep(9);
	return NULL;
}

// var. 2
void *db_thread(void *)
{
	char *c = (char *)malloc(100);
	sleep(9);
	free(c)
	return NULL;
}


// test.c:
int main(int argc, char* argv[])
{
  void *hahdle = dlopen("/path/lib.so", RTLD_LAZY);
  void *(*thread_func)(void *) = dlsym(hahdle, "db_thread");

  pthread_t db_thread;
  pthread_create(&db_thread, NULL, thread_func, NULL);

  int i=0;
  while(i<10){
	sleep(1);
  }

  // cancel, join thread;
  // free library
}


var.1 top:
Код: plaintext
1.
2.
3.
  PID USER        PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
26820 looser      20   0   74340   3408   2536 S   0,0  0,0   0:00.01 test
26821 looser      20   0   74340   3408   2536 S   0,0  0,0   0:00.01 test


var.2 top:
Код: plaintext
1.
2.
3.
  PID USER        PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
26596 looser      20   0  139876   3452   2580 S   0,0  0,0   0:00.04 test
26597 looser      20   0  139876   3452   2580 S   0,0  0,0   0:00.04 test


cat /proc/26596/smaps:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
7faf58021000-7faf5c000000 ---p 00000000 00:00 0
Size:              65404 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB

Т.е. при запуске второго варианта функции потока, при использовании malloc откуда-то/почему-то появляется блок памяти в 65 мегабайт.
Перерыл всё, нашёл здесь , что использование malloc/calloc/free в shared library безопасно.
Но что происходит понять не могу.
...
Рейтинг: 0 / 0
23.07.2016, 14:08
    #39279130
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Вай, сделал цикл бесконечным :)
Отвечать буду позже, надо срочно отъехать.
...
Рейтинг: 0 / 0
23.07.2016, 14:30
    #39279134
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Andrej_fпри использовании malloc откуда-то/почему-то появляется блок памяти в 65 мегабайт.

Это "куча". Она мелкими дозами не выделяется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2016, 17:58
    #39279166
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Dimitry Sibiryakov,

Готов согласиться, но
если запустить второй, третий, четвертый потоки, идентичные нашему первому, они все будут отжирать по 65 мег + стек.
Казалось бы, "65 мегабайт хватит всем".
Имхо, это не дело и должно быть решаемо.
...
Рейтинг: 0 / 0
23.07.2016, 18:00
    #39279168
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
И, почему в main malloc не выделяет на 100 байт 65 мегабайт?
Или, как тогда сказать потоку выделять память в общей куче (ведь, насколько я знаю, эта куча и так общая для main и для db_thread)?
...
Рейтинг: 0 / 0
23.07.2016, 18:07
    #39279171
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Andrej_fесли запустить второй, третий, четвертый потоки, идентичные нашему первому, они все будут
отжирать по 65 мег + стек.

Чем докажешь?

Andrej_fпочему в main malloc не выделяет на 100 байт 65 мегабайт?
Потому что у тебя в main() нет вызова malloc().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2016, 18:43
    #39279179
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Dimitry Sibiryakov

Дмитрий.
Искренне радуюсь за вас!
Классный профессионал, который без "позерства" помогает другим - просто замечательно.
...
Рейтинг: 0 / 0
23.07.2016, 18:51
    #39279180
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Dimitry SibiryakovПотому что у тебя в main() нет вызова malloc().Дмитрий, вы издеваетесь что ли?
...
Рейтинг: 0 / 0
23.07.2016, 19:03
    #39279181
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Andrej_fДмитрий, вы издеваетесь что ли?
Вот твой main(), строки пронумерованы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
1	int main(int argc, char* argv[])
2	{
3	  void *hahdle = dlopen("/path/lib.so", RTLD_LAZY);
4	  void *(*thread_func)(void *) = dlsym(hahdle, "db_thread");
5
6	  pthread_t db_thread;
7	  pthread_create(&db_thread, NULL, thread_func, NULL);
8
9	  int i=0;
10	  while(i<10){
11		sleep(1);
12	  }
13
14	  // cancel, join thread;
15  // free library
16	}


Назови мне номер строки с вызовом malloc(), поскольку я его в упор не вижу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2016, 19:14
    #39279183
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Dimitry Sibiryakov, я прошу вас помогать автору а не заниматься обструкцией.
...
Рейтинг: 0 / 0
23.07.2016, 19:31
    #39279184
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Andrej_f
Код: plaintext
1.
2.
3.
4.
  int i=0;
  while(i<10){
	sleep(1);
  }


Скорее всего так:
Код: plaintext
1.
2.
3.
4.
5.
6.
  int  i = 0;

  while( i < 10 ) {
   sleep( 1 );
   i++;
  }                               
...
Рейтинг: 0 / 0
23.07.2016, 19:32
    #39279185
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
maytonя прошу вас помогать автору
Я пытаюсь. Но я действительно стар и подслеповат, поэтому действительно не вижу вызова
malloc() в приведённой автором main()..

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2016, 19:41
    #39279186
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Andrej_fТ.е. при запуске второго варианта функции потока, при использовании malloc откуда-то/почему-то появляется блок памяти в 65 мегабайт.Ну так судя по коду у вас в while(i<10){ бесконечный цикл ...
Нет инкремента переменной i.
...
Рейтинг: 0 / 0
23.07.2016, 19:44
    #39279188
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Гм.
Оказывается автор поста в своем втором message уже понял причину утечки памяти.
Sorry за свои не нужные messges.
...
Рейтинг: 0 / 0
23.07.2016, 19:47
    #39279189
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Владимир2012Оказывается автор поста в своем втором message уже понял причину утечки памяти.

Обычно бесконечный цикл не приводит к утечкам памяти, если у него внутри нет выделения
памяти. А у автора в цикле только sleep(). sleep(), насколько я знаю, память не выделяет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2016, 19:59
    #39279192
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Dimitry SibiryakovОбычно бесконечный цикл не приводит к утечкам памяти, если у него внутри нет выделения
памяти. А у автора в цикле только sleep(). sleep(), насколько я знаю, память не выделяет.Судя по коду во во втором thread запрошенная память освобождается.
Но цикл то у него бесконечный!
Честно говоря не знаю как Linux создает нити, выделяет для них память ... /скорее всего какие-то ньюансы имеются/.
...
Рейтинг: 0 / 0
23.07.2016, 20:03
    #39279193
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Просвещаюсь: Процессы и нити в ОС Linux http://uinc.ru/articles/34/
...
Рейтинг: 0 / 0
23.07.2016, 20:08
    #39279194
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Владимир2012Судя по коду во во втором thread запрошенная память освобождается.
Но цикл то у него бесконечный!
И? Какое отношение бесконечный ничего не делающий цикл в одном потоке имеет к выделению
памяти в совершенно другом потоке?

Чтобы mayton не ругался, немного ликбеза:

Я не знаю деталей работы менеджера памяти в GLIBC, поэтому предполагаю, что он ленивый и
умный. Поэтому он не создаёт кучу до первого к ней обращения и не уничтожает её после
полного освобождения.

Возможно, он очень умный и создаёт отдельную кучу на каждый загруженный модуль чтобы при
его выгрузке можно было освободить всю выделенную память и предотвратить забитие адресного
пространства утекшей памятью.

Возможно, он ещё и очень хитрый, поэтому создаёт отдельные кучи для отдельных потоков в
надежде, что они будут обращаться в основном к "своей" куче и сэкономят ему время ожидания
мутекса для сериализации доступа к куче.

Но, как бы то ни было, при создании кучи идёт выделение исключительно виртуальной памяти и
никакой резервации физической. О чём и говорят цифры в стартовом посте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.07.2016, 20:09
    #39279195
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Если .SO собрана со статическим рантаймом, то у нее будет своя куча. Причем не только куча, но и все остальные структуры рантайма.

Кстати, вполне вероятно, что память занимает вовсе не куча.

Чтобы увидеть выделения памяти запустите программу в strace. Там среди прочих mmap будет и создание кучи.

А вообще, было бы неплохо приводить минимальный, но реально запускавшийся код, а не какие-то наброски от руки, которые работают только с ваших слов.
...
Рейтинг: 0 / 0
23.07.2016, 20:23
    #39279198
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Просьба автора topic показать cat /proc/26820/smaps
...
Рейтинг: 0 / 0
23.07.2016, 21:01
    #39279201
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
/proc/[pid]/smaps to get an idea of the memory footprint of the process.

proc - process information pseudo-filesystem http://man7.org/linux/man-pages/man5/proc.5.html

До конца не разобрался, но похоже на то, что
Size: 65404 kB
это размер памяти, выделенный процессу

PS: Бесконечный цикл не причем!
...
Рейтинг: 0 / 0
23.07.2016, 21:15
    #39279203
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Вообщем вот ответ:

However, one counter-example occurs on PPC64 kernels whereby a kernel using 64K as a base page size
still use 4K pages for the MMU on older processors.
To, this patch reports "MMUPageSize" as the page size by the MMU.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
cat /proc/26596/smaps:
7faf58021000-7faf5c000000 ---p 00000000 00:00 0
Size:              65404 kB
Rss:                   0 kB                                amount of the mapping that is currently resident in RAM ("Rss")
Pss:                   0 kB                                the process proportional share of this mapping ("Pss")
Shared_Clean:          0 kB                                number of clean and dirty private pages in the mapping
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB                                amount of memory currently marked as referenced or accessed
Anonymous:             0 kB                                amount of memory that does not belong to any file
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB                                entry is the page size used by the kernel to back a VMA. This matches the size used by the MMU in the majority of cases.
MMUPageSize:           4 kB
Locked:                0 kB
...
Рейтинг: 0 / 0
23.07.2016, 21:25
    #39279205
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Проще говоря.
Ни какой утечки памяти у автора топика нет.
while подправит и example будет работать корректно.
...
Рейтинг: 0 / 0
23.07.2016, 21:32
    #39279206
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Спасибо за помощь.

Про цикл - приведенный здесь код есть псевдокод - выдранный из реального текста кусок, забыл написать i++ в цикле, но к вопросу это отношение не имеет.

В моём случае есть полурешение - вместо malloc использовать alloca, который выделяет память в стеке.
С переменными это прокатывает и лишних блоков в 65 мег. нет, главное следить за размером переменных.

А вот что делать, например, с функциями типа PQconnectdb, которые возвращают указатель, создаваемый ими самими, я пока не знаю. Буду думать завтра.
...
Рейтинг: 0 / 0
23.07.2016, 21:36
    #39279207
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, с malloc в shared library, gcc, linux
Andrej_fА вот что делать, например, с функциями типа PQconnectdb, которые возвращают указатель, создаваемый ими самими, я пока не знаю. Буду думать завтра.Без обид.
Ваши ошибки - наши знания.
Пишите.
Поможем чем можем.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста, с malloc в shared library, gcc, linux / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]