II/ Les processus et la mémoire
1. Les processus et les threads
Chaque processus dispose d’un espace d’adressage virtuel privé de 4 Go dont 2Go sont réservés pour le système. La Figure 1 décrit cet espace d’adressage.
La mémoire système ne peut être accessible que par les threads en mode noyau du processus. Le code et les données du noyau sont situés dans la partie basse de la mémoire système et ne sont jamais paginés hors de la mémoire. En général, comme sur le MIPS R4000, cette zone de mémoire est directement projetée par le matériel (le processeur met les trois bits les plus significatifs à zéro pour toute adresse virtuelle située dans cette plage et utilise les bits restant comme adresse physique ; ainsi les données sont projetées dans la mémoire physique basse). La partie haute de la mémoire système est gérée par le VMM et lui permet de stocker des données systèmes soit dans une zone pouvant être paginée, soit dans une zone de 64 Ko interdisant cette pagination. La zone de mémoire système qui autorise la pagination permet au VMM de stocker toutes les structures, privées au processus, permettant les traductions d’adresses virtuelles.
Figure 1: Espace d'adressage virtuel d'un processus
Enfin, la mémoire utilisateur est la mémoire directement
utilisée par les threads et est entièrement gérée par le VMM. Comme pour la
mémoire système, deux régions de 64 Ko ne peuvent pas être paginés. Cette
première région est réservée pour la détection par le système de pointeurs
incohérents lors de l’exécution d’un thread. En effet, le compilateur
redirige tout pointeur contenant une adresse incohérente dans cette espace de mémoire.
Toute référence à cette zone de mémoire est interprétée par le système
comme une violation de mémoire. Ce mécanisme permet d’accentuer la
protection de chaque processus. En effet, un processus ou plutôt un thread ne
peut référencer qu’une adresse de son espace d’adressage privé. La deuxième
région est utiliser pour tous les pointeurs NULL.
Nous avons vu qu’un thread se trouve dans l’espace
d’adressage virtuel d’un processus et l’utilise pour le stockage des données
en cours d’exécution. On y trouve en particulier la pile utilisée lors de
l’exécution du thread en mode utilisateur (la pile utilisateur ou user’s
stack). La création d’un thread peut s’accompagner d’une demande
d’allocation d’espace mémoire réservé à la pile utilisateur, ou non. Le
VMM réserve alors l’espace nécessaire à l’exécution du thread. Cependant
toutes les pages ne seront pas allouées. La Figure
2 décrit comment le VMM alloue la pile d’un thread.
figure 2 : Allocation de la pile utilisateur d'un thread
Le VMM met à la disposition du thread une page de 4 Ko. Cette page est directement suivie d’une page « Page de Garde ». Le thread dispose ainsi d’un espace minimal pour s’exécuter. Lorsque cette espace devient insuffisant, le VMM alloue à la demande d’autres pages mémoires au thread, la page de garde restant au « sommet » de la pile. S’il n’y a aucune demande explicite, la taille de la pile pourra grossir jusqu'à 1 Mo (page de garde comprise) ; au delà, il y aura violation de mémoire. En fait, la page de garde a les droits PAGE_NOACCESS. Si un thread essaye d’écrire dans sa pile qui est pleine, c’est-à-dire que le VMM lui a alloué tout son espace d’adressage, il accédera à la page de garde : il y a alors violation d’accès mémoire. Dans le cas où la taille de la pile a été précisée à la compilation, la pile aura comme taille maximale ce paramètre (page de garde comprise).
2. Le jeu de pages de travail ou Process's working set
Le jeu de pages d’un processus est l’ensemble des pages
chargées en mémoire physique. Une taille minimale de jeu de pages de travail
est attribuée à chaque processus lors de sa création. Elle indique le nombre
de pages dont le processus est sûr de disposer en mémoire pendant son exécution.
Si la mémoire n’est pas trop pleine, le processus peut avoir le nombre de
pages correspondant au maximum de son jeu de travail (le processus peut même dépasser
cette valeur maximale si la quantité de mémoire disponible le permet). Par
contre, si la mémoire physique disponible devient trop faible, le VMM retire
des pages du jeu de pages de chaque processus dont la taille du jeu de pages
courant est plus grand que la taille minimale. Tant que la mémoire disponible
n’est pas suffisante, le VMM libère des pages jusqu'à ce que le jeu de pages
de travail de chaque processus atteigne son minimum. Quand le jeu de pages
d’un processus est à son minimum, le VMM observe alors s’il y a défaut de
page pour ce processus. Si c’est le cas, le VMM allouera à nouveau des pages
au processus, sinon il considérera que le jeu de pages de travail minimum du
processus est suffisant pour son exécution.
Cette technique est appelée la réduction automatique des
jeux de pages de travail ou automatic working-set trimming. Ce mécanisme permet
de prévenir l’écroulement du système ou trashing.
Un processus peut modifier les valeurs minimum et maximum de son jeu de pages de travail - sous réserve d’en avoir les droits - dans la limite d’un minimum et d’un maximum imposés par la base de stratégie locale du système de sécurité, Cependant, par défaut, personne n’a le droit de modifier le working-set d’un processus, y compris l’administrateur. Il faut modifier les droits avancés des utilisateurs pour autoriser cette modification.