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.