« Programmation C/Gestion de la mémoire » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎<code>calloc</code> : allocation avec initialisation à 0 : précision pour les types flottants et pointeur
Ligne 14 :
Les déclarations de variables en C et dans beaucoup d'autres langages ont une limitation très importante : la taille des variables doit être connue à la compilation. Cela pose problème quand on ne sait qu'à l'exécution le nombre de données qu'on doit traiter. Pour résoudre ce problème, et pouvoir décider durant l'exécution d'un programme du nombre de variables à créer, il faudra nécessairement passer par de l'allocation dynamique de mémoire. Avec ce système, le programmeur dispose de fonctions qui permettent de demander au système une zone mémoire d'une certaine taille, qu'il pourra utiliser comme il le souhaite. En C, ces fonctions sont disponibles dans l'en-tête <tt>stdlib.h</tt>.
 
L'un des principaux avantages qu'offre le langage C est sa capacité à fournir au programmeur un contrôle poussé sur la gestion de la mémoire. Cette liberté laisséenécessite aunéanmoins programmeur a malheureusement sa contrepartie...une Engrande effetrigueur, contrairementtant àles d'autresproblèmes langages,pouvant lesurvenir Csont nenombreux possèdeet nisouvent garde-fousdifficiles nià routinesdiagnostiquer. ([[w:ramasse-miettes|ramasse-miettes]]On oupeut ''garbagedire collector'')sans prendre chargésbeaucoup de gérerrisque que la mémoire. Une part conséquenteplupart des erreurs de programmation aen C, ont pour origine une mauvaise utilisation des fonctions de gestion de la mémoire. Il ne faut pas sous-estimer la difficulté de cette tâche. Autant cela est trivial pour un programme de quelques centaines de lignes, autant cela peut devenir un casse-tête quand ledit programme a subi des changements conséquents, pas toujours fait dans les règles de l'art.
 
La manière dont la mémoire physique d'un ordinateur est conçue, ainsi que la façon dont le système d'exploitation la manipule, sont très variables. Cependant, onun peutmodèle considérer,assez declassique manèreconsiste trèsà générale,découper qu'un ordinateur possède une zonela mémoire découpées en secteurs.segments, Chaquesegments secteurdont eston identifiégarde parles uneréférences adressedans (undes numérotables ende quelquepages sorte).: Le système dc'exploitationest installéle sur la machine possède une table dans laquelle sont référencées toutes les adresses mémoires auxquelles il peut accéder. Le système utilise et met à jour cette table en permanence, ce qui lui permetmodèle de savoir quels secteurs sont libres et quels secteurssegmentation sont/ réservéspagination. UnCe secteurmodèle estoffre ditbeaucoup réservéd'avantages si son accès estpar limitérapport à un processusaccès particulierpurement lelinéaire. temps deDécrire son exécution.fonctionnement Cetteen gestiondétail est capitalehors pourde lela systèmeporté carde ellecet empêcheouvrage, qu'unmais programmeon viennepourra écrirenoter surtout lesde zonesmême mémoire utilisées par un autre.:
* Indépendance totale de l'espace d'adressage entre les processus : un processus ne peut pas accèder à la mémoire d'un autre processus. C'est pourquoi transmettre la valeur d'un pointeur à un autre processus ne servira en général à rien, car le second processus ne pourra jamais accéder à l'emplacement pointé.
* Gestion fine de la mémoire : les segments sont accèdés via plusieurs niveaux d'indirection dans les tables de pages. Cela permet de mettre virtuellement les segments n'importe où dans la mémoire ou même sur un système de fichier. Dans la pratique, éparpiller trop les segments (fragmenter) réduit significativement les performances.
 
Au niveau des inconvénients, on citera essentiellement un problème de performances. Plusieurs niveaux d'indirection impliquent de multiple lectures en mémoire, extrêmement pénalisant en terme de temps d'exécution, au point où des caches sont nécessaires pour garantir des vitesses acceptables. Même si RAM veut dire mémoire à accès aléatoire, il faut bien garder à l'esprit qu'un accès purement séquentiel (adresse mémoire croissante) peut être jusqu'à cent fois plus rapide qu'une méthode d'accès qui met sans cesse à défaut ce système de cache.
 
Un processus peut donc demander au sytème de réserver pour son usage exclusif un secteur mémoire de taille déterminée. Il peut également demander au sytème de modifier la taille d'une zone précédemment réservée ou de la libérer s'il n'en a plus l'utilité.