télécharger 34.26 Kb.
|
Description de la mémoire La mémoire physique sur un système se divise en deux catégories :
La mémoire physique sert de zone de stockage temporaire pour les programmes et données que vous utilisez. De façon générale, plus la quantité de mémoire est importante, plus vous pouvez lancer d'applications simultanément. D'autre part, plus celle-ci est rapide plus votre système réagit vite, il s'agit donc (pour le système d'exploitation) de l'organiser au mieux pour en tirer le maximum de performances. La gestion de la mémoire La gestion de la mémoire est un difficile compromis entre les performances (temps d'accès) et la quantité (espace disponible). On désire en effet tout le temps avoir le maximum de mémoire disponible, mais l'on souhaite rarement que cela se fasse au détriment des performances. La gestion de la mémoire doit de plus remplir les fonctions suivantes :
L'extension de la mémoire Il est possible d'étendre la mémoire de deux manières :
Les mécanismes de découpage de la mémoire La mémoire centrale peut-être découpée de trois façons :
Pages et les erreurs de page La page (aussi nommée « page mémoire » ou « page virtuelle ») est un bloc mémoire contigu et de taille fixe de mémoire virtuelle. La mémoire virtuelle permet d’adresser et utiliser une page, autrement absente de la mémoire virtuelle. Lorsqu’un programme essaie d’accéder un espace mémoire d’une page, un message d’exception appelé une erreur de page est levé. Le matériel ou le système d’exploitation est informé de cette page absente et la transfère de la mémoire virtuelle à la mémoire La piles (stack) et le tas (heap) Le tas n'a pas de vocation particuliere et est un bloc de mémoire allouable au byte près. Dans le tas, des bloc mémoires peuvent être alloués ou supprimés, laissant des « trous » inutilisés. Si un récupérateur de mémoire (garbage collector) ne passe pas en arrière pour compacter l’espace laissé vacant, la performance se dégrade et on peut manquer plus rapidement de mémoire. Néanmoins, l’espace mémoire du tas est essentiel pour contenir des nouvelles informations non prévues. La pile est de la mémoire paginée (réserve par page de 4 Ko) et a pour seule utilisateur le registre pointeur de pile (ESP pour Extended Stack Pointer). Au démarrage, il y a obligatoirement une pile de crée avec le programme. La pile est particulièrement efficace par sa simplicité : On ne peut qu’empiler ou dépiler de la pile, les blocs mémoire sont toujours contigus, ne laissant pas de « trous » contrairement au tas. Adressage On parle d’une architecture 32-bits lorsque les mots manipulés par le processeur ont une largeur de 32 bits, ce qui leur permet de varier entre les valeurs 0 et 4 294 967 295 pour un mot non signé (232), et entre −2 147 483 648 et 2 147 483 647 pour un mot signé (232-1). Avec la version 64-bits de Windows, la mémoire maximale n’est pas 264, mais limitée par la version de Windows. Par exemple, pour Windows 7, on aura
Lorsque le mot de 32 bits sert à coder l’adresse d’un élément, il peut adresser une mémoire de taille 4 Go. Donc un système d'exploitation Microsoft Windows de 32 bits ne pourra pas utiliser plus de 4 Go de RAM. ![]() Selon le type de référence demandé (entier, caractère, entier long, flottant double, …), l’adresse mémoire réfère à l’adresse la plus basse en mémoire . 0x00000C800F2B-0x00000C800F24 : 3041 C042 D043 B544 Si on réfère au caractère à l’adresse 0x00000C800F24, on parlera de la lettre « D » (0x44). Le caractère suivant sera « μ » pour 0xB5. Celui d’après sera la lettre « C ». Notons au passage que la lettre « C » se trouve en réalité à l’adresse 0x00000C800F26. Pour un entier, nous aurons à l’adresse 0x00000C800F24 la valeur 46404 (0xB544). Pour un entier long, ce sera 3494098244 (0xD043B544). Finalement, pour un flottant double, on aura 3.06601592743e-76 pour 0x3041C042D043B544. Ainsi, comme nous l’avons vu au premier cours, l’interprétation de la valeur à une adresse donnée variera en fonction du type de donnée à examiner. Utilisation de la mémoire par un programme Préparation du code Dans l’exemple suivant, voyons comment un programme est utilisé en mémoire. Prenons le code simple qui suit : #include static void display(int i, int *ptr); int main(void) { int x = 5; int *xptr = &x; printf("Dans le MAIN():\n"); printf("La valeur de x est %d et est à l’adresse %p.\n", x, &x); printf("Le pointeur xptr pointe à l’adresse %p qui contient la valeur %d.\n", xptr, *xptr); display(x, xptr); return 0; } void display(int y, int *yptr) { char var[7] = "ABCDEF"; printf("Dans la function DISPLAY():\n"); printf("La valeur de y est %d et est à l’adresse %p.\.\n", y, &y); printf("Le pointeur yptr pointe à l’adresse %p qui contient la valeur %d.\n", yptr, *yptr); } À la compilation, le code est fragmenté en objet distinct. Les appels de code hors du programme principal sont énumérés dans une table de relocalisation. Dans le code plus haut, nous en avons deux exemples hors du MAIN() :
Comme l’assemblage en langage machine ôte toute référence d’étiquettes (comme DISPLAY() ou PRINTF), la table de relocalisation est ajoutée au programme principal pour lui rappeler de faire appel à ces autre objets étrangers. ![]() Ainsi, à la phase finale de la compilation, l’éditeur de liens (linker) résoudra ces références en remplaçant (certains diront en fusionnant) l’étiquette de ces objets par le code véritable ou l’adresse du code de ces objets. On parle alors de liens statiques car définis à la création de l’exécutable. Dans certains cas, les objets ne seront pas fusionnés avec le code. Au lieu de cela, des instructions particulières seront insérées dans votre code afin d’informer celui-ci d’appeler le code manquant au moment de son exécution. On parle de liens dynamiques. C’est généralement le cas des programmes qui font appel aux DLLs. Nous verrons les DLL dans un cours prochain. Exécution du code statique Lorsque le code est exécuté, il est avant tout chargé en mémoire. Généralement, le programme est composé de 5 zones :
![]() Exercices
|
![]() | ![]() | «faire plaisir» à l’autre (ce qui n’est pas l’enjeu de l’échange lorsque, par exemple, on achète une baguette de pain). Ainsi, «l’échange»... | |
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() | ||
![]() | ![]() |