Forum Programmation.c Probleme sur la liberation memoire du thread

Posté par  .
Étiquettes : aucune
0
15
oct.
2005
bonjour,

Voila j'ai programme un petit serveur en C qui utilise les pthread.
Les thread sont creer a chaque connexion d'un client.
je met les pthread en detached pour qu'à la fin du thread, celui ci libere la memoire. Pour tant je vois que mon processus serveur prend tjs de la mémoire.
Bref voici un bout de code qui sera plus parlant

pthread_attr_setdetachstate (&thread_attr,PTHREAD_CREATE_DETACHED);

while(1)
{
.
.
if((sock_client=accept(sockfd,(struct sockaddr*)&sockadr_client,&client_length))<1)
{
.
.
}
else
{
.
.
pthread_create(&client_thread_create, &thread_attr, Thread_client, (void *)&sock_client);
}
}


ma focntion de thread :
void *Thread_client (void *new_sock)
{
int num_s = *(int*)new_sock;
pthread_t id_thread;
char toto[5000000];
memset((char *) &toto,55,5000000);

pthread_mutex_lock(&mutex); // debut de la section critique
close(num_s);
nb_clients--;
pthread_mutex_unlock(&mutex); // fin de la section critique
pthread_exit(NULL);
}


j'ai mis un tableau de 5000000 pour que l'appli prenne 5 MO de memoire ce qui fait 1% de ma memoire.

A chaque client qui se connect j'ai 1% de ma memoire qui est prise est qui n'est jamais libéré :((

Si qelqu'un pouvais me dire pourquoi ma memoire ne se libere pas alors que j'ai creer les thread en detached :(
  • # buffer

    Posté par  . Évalué à -2.

    Salut

    Je pense que si tu change
    > char toto[5000000];
    par un pointeur auquel tu alloue la taille voulue de memoire
    il n'y auras plus qu'a libere la memoire a la fin du thread

    Allez tous vous faire spéculer.

  • # Ne pas confondre

    Posté par  . Évalué à 4.

    La mémoire prise par le thread et la mémoire allouée par le thread.
    En créant un thread tu prend de la mémoire. Les structures et les fonctions du threads lui sont propres et elles seront nettoyées lors de la destruction du thread.
    Mais même si tu créé tes threads en mode detached, la mémoire est toujours allouées par le process. Vis à vis du kernel c'est le process qui a réclamé de la mémoire, et comme le process tourne toujours, la mémoire n'est pas libérable automatiquement.

    Rien à voir mais je le dis quand même :
    Ne connaissant pas les libs que tu utilises et la fonctionnalité de ton programme je m'abstiendrais de juger hativement, mais tu es sur pour les casts en pagaille ?
    • [^] # Re: Ne pas confondre

      Posté par  (site web personnel) . Évalué à 2.

      Et quand bien même ca serait libérer automagiquement, c'est une très mauvaise idée à plus forte raison en C
    • [^] # Re: Ne pas confondre

      Posté par  . Évalué à 1.

      Merci de votre aide :)

      En fait j'ai aussi essaye a la place de (char toto[5000000];) de mettre char *toto = (char *)malloc(5000000); et a la fin du thread juste avant (pthread_exit(NULL);) j'ai mis free(toto);
      mais la memoire ne se libere pas.
      Alors si c le process qui a reclamé la memoire, comment faire pour liberer cette memoire qui me pose vraiment du soucis :((

      Merci encore de votre aide ;)
      • [^] # Re: Ne pas confondre

        Posté par  (site web personnel) . Évalué à 3.

        C'est pas forcément parce que tu as fait un free(3) que la mémoire sera immédiatement retournée à l'OS.

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

      • [^] # Re: Ne pas confondre

        Posté par  . Évalué à 1.

        Je pense que tu devrait pas t'inquiéter... la mémoire reste attachée au process pour des allocation futures... ce qui fait que si tu lance un autre thread... tu ne devrais pas voir la mémoire augmenter plus qu'elle ne l'est déjà... sauf si t'as plein de thread concurrents...

        Si jamais un autre process à desoin de mémoire et qu'il n'en reste plus, normalement la procédure de swaping (page fault) va se rendre compte que ton programme ne l'utilise plus et va la redonner au programme qui en a besoin, pour éviter de faire un vrai swaping...
        en gros tu peux considérer que ton programme se voit allouer plein de mémoire, mais ce n'est que virtuel...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.