IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages de programmation Discussion :

Compilation, la séparation du tas dans la mémoire


Sujet :

Langages de programmation

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut Compilation, la séparation du tas dans la mémoire
    Bonjour, je ne savais pas trop où poser cette question, désolé si cela n'est pas la bonne place.
    Donc j'étudie en ce moment le fonctionement d'un compilateur, plus précisement le fonctionement du tas.
    D'après ce que j'ai compris, le tas doit être virtuellement séparé en une suite d'espaces mémoir ayant une taille de puissance de deux. Bon mais je dois avoeur ne pas comprendre l'intérêt de cette séparation, pourriez vous m'éclaircire sur ce point ?

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pour remettre les choses au point :
    + quelles bases as-tu en théorie des langages ?
    + as-tu fait des interprètes ? des compilateurs vers VM ?
    + connais-tu suffisamment l'architecture pour laquelle tu veux faire un backend ?

    le tas doit être virtuellement séparé en une suite d'espaces mémoire ayant une taille de puissance de deux
    perso, j'ai vu dans le code d'une jvm que le tas était alloué à une taille donnée, puis on mettait des données dedans... et quand y a plus de place, on regarde si on est pas déjà à la taille maximale possible ou autorisée, et si ce n'est pas le cas, on double la taille du tas

    c'est assez simple...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Il faut savoir de quel tas tu parles : est-ce qu'il s'agit du tas automatique, dans le cas du C, de la mémoire allouée statiquement à la compilation, ou encore du tas dynamique ?

    Si c'est le dernier cas, c'est-à-dire le tas tel que géré par malloc(), en C, ce n'est absolument pas une affaire de compilation. Il est vrai que certaines implantations de malloc(), notament le malloc() GNU, utilisent un principe de découpage de cases mémoires de taille de puissance de 2 uniquement pour les petits objets, mais ce n'est pas, et de loin, la seule solution.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Il y a de vieilles implémentations (et peut être des récentes) de malloc qui utilise les appels systèmes brk/sbrk qui ne font que repousser la limite du tas selon ce que l'on demande.

    Ensuite, à toi de gérer le déplacement comme tu le souhaites.
    Je ne répondrai à aucune question technique en privé

  5. #5
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Oui, tout à fait : mais le problème de sbrk() et brk() vient du fait qu'il s'agit d'une fonction très rigide. En utilisant mmap(), on peut rendre la mémoire au système plus facilement, alors qu'avec sbrk()... c'est beaucoup plus compliqué !

    Les implantations un peu plus modernes sont faites à coups de mmap(), au moins en ce qui concerne l'allocation des gros blocs de mémoire, qui sont rendus immédiatement au système lors de l'invocation de free().

    Dans la GLibC, il y a les fonctions mmalloc() et mfree() qui permettent, entre autres, d'organiser la mémoire en plusieurs tas séparés : ce sont des fonctions de plus haut niveau que malloc() et free(), mais portables uniquement sur GNU.

    Cependant, une implantation efficace de malloc() et de free(), robuste, c'est au bas mot 3000 à 4000 lignes de code...
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par InOCamlWeTrust Voir le message
    Oui, tout à fait : mais le problème de sbrk() et brk() vient du fait qu'il s'agit d'une fonction très rigide. En utilisant mmap(), on peut rendre la mémoire au système plus facilement, alors qu'avec sbrk()... c'est beaucoup plus compliqué !

    Les implantations un peu plus modernes sont faites à coups de mmap(), au moins en ce qui concerne l'allocation des gros blocs de mémoire, qui sont rendus immédiatement au système lors de l'invocation de free().

    Dans la GLibC, il y a les fonctions mmalloc() et mfree() qui permettent, entre autres, d'organiser la mémoire en plusieurs tas séparés : ce sont des fonctions de plus haut niveau que malloc() et free(), mais portables uniquement sur GNU.

    Cependant, une implantation efficace de malloc() et de free(), robuste, c'est au bas mot 3000 à 4000 lignes de code...
    Ah oui, je me disais qu'il devait y avoir des implémentations mieux qu'avec brk/sbk étant donné qu'il n'était pas possible de faire revenir le tas en arrière (donc il n'y avait aucune libération de mémoire réelle jusqu'à la fin du processus).

    En plus, j'aurais dû le savoir, je l'avais déjà utilisé avec shm_open pour partager une zone mémoire entre deux programmes
    Je ne répondrai à aucune question technique en privé

  7. #7
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Certaines implantations de brk() sont faites de façon à faire diminuer le segment de données en cas d'argument négatif... mais je ne sais absolument pas si c'est standard, étant donné que ce sont des fonctions POSIX (si je me souviens bien...). En tous cas, cette "fonctionnalité" de brk() serait très difficile à exploiter, essentiellement du fait que les données à libérer et les blocs mémoire à rendre au système ne sont pas nécessairement en fin de segment.

    Cependant, les systèmes évoluant, on peut faire de très bonnes implantations de malloc(), beaucoup plus rapides que le malloc() et free() GNU (j'en ai fait une qui était bien avancée et reposait sur un système entièrement différent), construites autour de la seule fonction sbrk() : les pages allouées et inutilisées par le programme ne seront, de toute façon, jamais réellement allouées par le système. Linux se comporte ainsi, par exemple.

    Comme quoi, aujourd'hui, on peut se concentrer uniquement sur les performances en termes de temps de calcul et délaisser l'optimisation de l'utilisation de la mémoire (mais tout de même pas trop, hein !), chose inconcevable il y a quelques années encore.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben disons que ça dépend des cas de figure....

    Si tu as une appli tournant 24/24 et demandant 10 megs/h, va bien falloir que tu t'en occupes quand même...

    Sinon pour la remarque sur Linux pas complètement faux, mais pas complètement vrai non plus.. Xemacs fait redescendre sa mémoire au fur et à mesure des fichiers ouverts ou fermés (sa mémoire totale VUE de l'extérieur par top par exemple).

    Il est cependant vrai que Unix et Linux considère qu'elle appartient encore au processus.. Cependant, dans les cas comme Xemacs, elle devient de facto dispo pour les autres processus...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Erreur dans script mémoire - problème de calcul
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 30/07/2007, 12h01
  2. Compiler informations de deux combobox dans une textbox
    Par thiephaine59000 dans le forum Général VBA
    Réponses: 1
    Dernier message: 14/05/2007, 17h58
  3. Séparation de données dans une zone de texte
    Par rantanplan81 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/04/2007, 15h23
  4. Réponses: 3
    Dernier message: 02/03/2007, 15h35
  5. [TP]Compiler un prog sans entrer dans TP7
    Par poppels dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 23/10/2002, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo