La mémoire

Voici une petite explication sur la gestion mémoire sur un système NeXTSTEP mais plus généralement sur un système unix.

Les pages

La page est l'unité de base de la gestion mémoire. Il existe des pages sur disque et des pages en mémoire. Sur disque, la taille des pages dépend du système de fichier. Cette taille est typiquement de 4 Ko. Le système unix est capable de gérer simultanément différents types de partitions, et donc différentes tailles de pages disque. En mémoire, les pages font typiquement 8 Ko.

Le disque contient différents programmes. Un programme est un fichier exécutable. Une fois lancé en mémoire un programme charge dynamique une ou plusieurs bibliothèques du systéme. Un programme utilise un espace disque virtuel (en marron sur le schéma). Seule une partie de cet espace est effectivement en mémoire (violet). En plus des pages venant du disque, un programme utilise de la mémoire qu'il alloue dynamiquement (en marron clair).

Quand un programme tourne en mémoire, il n'a pas besoin de charger tous son fichier exécutable depuis le disque, il ne charge que les pages qu'il utilise. Ainsi au lancement du programme, le système charge en mémoire une page et une seule. Le programme commence alors à tourner en exécutant cette page. Une deuxième page, puis une troisième... est chargée... Plus le programme tourne, plus il charge des pages en mémoire. À la limite, si le programme exécute toutes ses routines, toutes les pages sur disques seront en mémoire.

Quand plusieurs programmes tournent en même temps, ils partagent parfois des zones mémoires (des pages). C'est typiquement le cas des bibliothéques partagées.

Pour encore améliorer la gestion mémoire, un programe NeXTSTEP est décomposé en plusieurs fichiers sur disque qui sont chargés à la demande de l'application (par exemple les fichiers .nib).

Le swap disque

Unix gère la mémoire en virtuel. La mémoire virtuelle est la somme de la mémoire physique (la RAM) et un espace sur disque appelé swap.

La mémoire RAM contient le noyau du système (qui sous NeXTSTEP est résident), ainsi qu'une large zone mémoire pour charger toutes les applications. Le swap est une zone de débordement sur disque qui n'est utilisée que si toute la RAM est occupée. Le swap peut être un fichier "normal" sur disque ou une partition complète.

Comme le noyau est en RAM et qu'il contient de nombreux drivers, le chargement de ceux-ci est généralement dynamique. Ceci permet d'avoir le noyau le plus petit possible, et de n'utiliser la précieuse RAM que lorsque c'est nécessaire.

Pour avoir les meilleures performances sur un système unix, le mieux est de jamais swapper. Et donc le mieux est d'avoir le maximum de RAM. Pour accélérer les accès au swap, on le place généralement sur un autre disque que le disque des applications.

Programme

Les programmes tournent dans la RAM de la machine. Plusieurs programmes peuvent tourner simultanément en mémoire.

Différents programmes peuvent partager certaines zones mémoire. C'est par exemple le cas des bibliothéques système qui sont partagées entre tous. Et donc la taille totale prise en RAM par les programmes n'est pas la somme des tailles de ces programmes.

Un programme (qui est constitué de multiples pages mémoire) voit sa mémoire de façon contiguë alors que ces pages peuvent être dispersées dans toute la RAM et même dans le swap disque.

Ceci est totalement transparent aux programmes qui n'ont pas à gérer cela. Le programme utilise sa mémoire sans savoir si celle-ci se trouve en RAM ou dans le swap disque. La seule différence est la vitesse d'exécution.

Le cache disque

Pour accélérer les accès disque, le système utilise un cache disque qui est une zone mémoire en RAM. Quand un programme accède à un fichier sur disque, les pages du fichier sur disque sont recopiées dans des pages en RAM. Plus le programme lit des données dans le fichier, plus le cache disque en RAM augmente. Si le programme relit dans le fichier une donnée déjà lue, le système peut la fournir rapidement grâce au cache disque sans avoir à relire le disque.

La taille de la RAM est limitée alors que l'on peut lire de gros fichiers. Et donc un moment donné toute la RAM est prise pour les programmes et le cache disque. Dans ce cas le système, doit libérer des pages RAM. Suivant les versions d'unix, la stratégie varie, mais en règle générale, la méthode suivante est appliquée.

Le noyau du système maintient pour chaque page en mémoire virtuelle (RAM + swap) des informations qui lui permettent de prendre des décisions. Chaque page a des drapeaux indiquant si la page est en cours d'utilisation par un ou plusieurs programmes. Un drapeau indique aussi si la page fait partie d'un programme ou si c'est une page du cache disque. Dans ce cas soit les données viennent d'un fichier, soit les données viennent d'un programme qui a fait une écriture. Une page du cache marquée comme ayant des données sera enregistrée dans le fichier sur disque sur timer (par exemple toutes les minutes).

À chaque page est associée une date de dernière utilisation, ainsi quand le système a besoin de libérer des pages en RAM, il peut en swapper certaines (les pages des programmes) vers le swap disque. Si les pages font partie du cache disque, les pages ayant des données à écrire seront écrites sur disque, alors que les pages qui ne contiennent que des données en lecture peuvent être purement et simplement libérées. Tout cela dépent principalement de la date de dernière utilisation. Les pages les plus vieilles sont libérées de la RAM.