Как я понимаю использование памяти pthread_create? - PullRequest
0 голосов
/ 30 октября 2018

Вот пример кода

Создает отдельный поток

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *show_message( void *ptr )
{
    char *message;
    message = (char *) ptr;
    printf("[%s] start\n", message);
    int x = 3;
    for(x = 3 ; x > 0 ; --x){
        printf("%s \n", message);
        sleep(2);
    }
    printf("[%s] end\n", message);
}

int create_thread(char *message)
{
    pthread_attr_t att;
    pthread_attr_init(&att);
    pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED);
    pthread_t thread;
    pthread_create(&thread, &att, show_message, (void*)message);

    return 0;
}

int main(){
    sleep(3);

    create_thread("Thread 1");

    while(1) {};

    return 0;
}

Результат Valgrind не показывает утечек

== 9872 == РЕЗЮМЕ КАРТЫ:

== 9872 == используется на выходе: 0 байтов в 0 блоках

== 9872 == общее использование кучи: 2 выделения, 2 освобождения, 1296 выделенных байтов

== 9872 ==

== 9872 == Все блоки кучи были освобождены - утечки невозможны


но я читаю / proc / [pid] / statm

Размер и житель становятся выше

[~] $ while [ 1 ]; do cat /proc/`pidof pthread_example`/statm; sleep 2; done

1596 218 198 1 0 50 0 <- пробег </p>

1596 218 198 1 0 50 0

20062 218 198 1 0 18516 0 <- [Тема 1] начало </p>

20062 218 198 1 0 18516 0

20062 218 198 1 0 18516 0

20062 299 278 1 0 18516 0 <- [Тема 1] конец </p>

20062 299 278 1 0 18516 0


почему?

1 Ответ

0 голосов
/ 30 октября 2018

Если вы спрашиваете, почему объем памяти процесса не уменьшается при освобождении памяти, это на самом деле довольно просто.

Когда в процессе требуется дополнительная память (например, когда вы пытаетесь выделить какую-то память, но ее там недостаточно), процесс запрашивает больше памяти у операционной системы.

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

Думайте об этом так:

    A              B             C
+--------+     +--------+    +--------+
| Memory |     | Memory |    | Memory |
|    for | <-> |     in | <- |     in |
|    you |     |   heap |    |     OS |
+--------+     +--------+    +--------+

Вполне вероятно, что память перемещается в обе стороны между A и B, когда вы выделяете и освобождаете ее, но она только из C в B необходимо. Конечно, когда ваш процесс завершается, все, что находится в B, будет возвращено.

Имейте в виду, что это концептуальное описание, вероятно, нет никакой фактической памяти, выходящей из ОС, точнее будет то, что ОС просто расширяет ваше адресное пространство до больший размер. Фактическая память распределяется по мере необходимости любым имеющимся у вас менеджером виртуальной памяти.

...