Une page , une page mémoire ou une page virtuelle est un bloc contigu de longueur fixe de mémoire virtuelle , décrit par une seule entrée dans une table de pages . Il s'agit de la plus petite unité de données pour la gestion de la mémoire dans un système d'exploitation qui utilise la mémoire virtuelle. De même, un cadre de page est le plus petit bloc contigu de longueur fixe de mémoire physique dans lequel les pages mémoire sont mappées par le système d'exploitation.
Un transfert de pages entre la mémoire principale et une mémoire auxiliaire, telle qu'un disque dur , est appelé pagination ou échange.
Explication
La mémoire de l'ordinateur est divisée en pages afin que les informations puissent être trouvées plus rapidement.
Le concept est nommé par analogie avec les pages d'un livre imprimé. Si un lecteur voulait trouver, par exemple, le 5 000e mot du livre, il pourrait compter à partir du premier mot. Cela prendrait du temps. Ce serait beaucoup plus rapide si le lecteur avait une liste du nombre de mots sur chaque page. À partir de cette liste, il pourrait déterminer sur quelle page apparaît le 5 000e mot et combien de mots compter sur cette page. Cette liste des mots par page du livre est analogue à une table de pages d'un système de fichiers informatique .
Taille de la page
Compromis sur la taille de la page
La taille des pages est généralement déterminée par l'architecture du processeur. Traditionnellement, les pages d'un système avaient une taille uniforme, par exemple 4 096 octets . Cependant, les conceptions de processeurs autorisent souvent deux ou plusieurs tailles de page, parfois simultanées, en raison de leurs avantages. Plusieurs points peuvent être pris en compte dans le choix de la meilleure taille de page.
Taille du tableau des pages
Un système avec une taille de page plus petite utilise plus de pages, ce qui nécessite une table de pages qui occupe plus d'espace. Par exemple, si un espace d'adressage virtuel de 2 32 est mappé sur des pages de 4 Ko (2 12 octets), le nombre de pages virtuelles est de 2 20 = (2 32 / 2 12 ). Cependant, si la taille de page est augmentée à 32 Ko (2 15 octets), seules 2 17 pages sont nécessaires. Un algorithme de pagination à plusieurs niveaux peut réduire le coût mémoire de l'allocation d'une grande table de pages pour chaque processus en divisant davantage la table de pages en tables plus petites, ce qui permet de paginer efficacement la table de pages.
Utilisation du TLB
Comme chaque accès à la mémoire doit être mappé de l'adresse virtuelle à l'adresse physique, la lecture de la table des pages à chaque fois peut être assez coûteuse. Par conséquent, un type de cache très rapide, le tampon de traduction (TLB), est souvent utilisé. Le TLB est de taille limitée et lorsqu'il ne peut pas satisfaire une demande donnée (un échec TLB ), les tables de pages doivent être recherchées manuellement (au niveau du matériel ou du logiciel, selon l'architecture) pour obtenir le mappage correct. Des tailles de page plus grandes signifient qu'un cache TLB de la même taille peut suivre de plus grandes quantités de mémoire, ce qui évite les échecs TLB coûteux.
Fragmentation interne
Il est rare que les processus nécessitent l'utilisation d'un nombre exact de pages. Par conséquent, la dernière page ne sera probablement remplie que partiellement, gaspillant ainsi une certaine quantité de mémoire. Des tailles de page plus grandes entraînent une grande quantité de mémoire gaspillée, car davantage de parties de mémoire potentiellement inutilisées sont chargées dans la mémoire principale. Des tailles de page plus petites garantissent une correspondance plus étroite avec la quantité réelle de mémoire requise dans une allocation.
À titre d'exemple, supposons que la taille de la page soit de 1 024 B. Si un processus alloue 1 025 B, deux pages doivent être utilisées, ce qui donne 1 023 B d'espace inutilisé (où une page consomme entièrement 1 024 B et l'autre seulement 1 B).
Accès au disque
Lors d'un transfert à partir d'un disque rotatif, une grande partie du retard est due au temps de recherche, le temps nécessaire pour positionner correctement les têtes de lecture/écriture au-dessus des plateaux du disque. De ce fait, les transferts séquentiels volumineux sont plus efficaces que plusieurs transferts plus petits. Le transfert de la même quantité de données du disque vers la mémoire nécessite souvent moins de temps avec des pages plus grandes qu'avec des pages plus petites.
Obtenir la taille de la page par programmation
La plupart des systèmes d'exploitation permettent aux programmes de découvrir la taille de la page au moment de l'exécution . Cela permet aux programmes d'utiliser la mémoire plus efficacement en alignant les allocations sur cette taille et en réduisant la fragmentation interne globale des pages.
Systèmes d'exploitation basés sur Unix et POSIX
Les systèmes basés sur Unix et POSIX peuvent utiliser la fonction système sysconf(), comme illustré dans l'exemple suivant écrit dans le langage de programmation C.
#include <stdio.h> #include <unistd.h> /* sysconf(3) */ int main ( void ) { printf ( "La taille de page pour ce système est de %ld octets. " , sysconf ( _SC_PAGESIZE )); /* _SC_PAGE_SIZE est également OK. */ retourner 0 ; }
Dans de nombreux systèmes Unix, l'utilitaire de ligne de commande getconfpeut être utilisé. Par exemple, getconf PAGESIZErenverra la taille de la page en octets.
Systèmes d'exploitation basés sur Windows
Les systèmes d'exploitation basés sur Win32 , tels que ceux des familles Windows 9x et Windows NT , peuvent utiliser la fonction système GetSystemInfo() de kernel32.dll.
#include <stdio.h> #include <windows.h> int main ( void ) { SYSTEM_INFO si ; GetSystemInfo ( & si ); printf ( "La taille de page pour ce système est de %u octets. " , si . dwPageSize ); retourner 0 ; }
Plusieurs tailles de page
Certaines architectures de jeux d'instructions peuvent prendre en charge plusieurs tailles de page, y compris des pages nettement plus grandes que la taille de page standard. Les tailles de page disponibles dépendent de l'architecture du jeu d'instructions, du type de processeur et du mode de fonctionnement (d'adressage). Le système d'exploitation sélectionne une ou plusieurs tailles parmi celles prises en charge par l'architecture. Notez que tous les processeurs n'implémentent pas toutes les tailles de page plus grandes définies. Cette prise en charge de pages plus grandes (appelées « énormes pages » sous Linux , « superpages » sous FreeBSD et « grandes pages » dans la terminologie Microsoft Windows et IBM AIX ) permet de bénéficier du « meilleur des deux mondes », en réduisant la pression sur le cache TLB (en augmentant parfois la vitesse jusqu'à 15 %) pour les allocations importantes tout en maintenant l'utilisation de la mémoire à un niveau raisonnable pour les petites allocations.
À partir du Pentium Pro et de l' AMD Athlon , les processeurs x86 prennent en charge des pages de 4 Mio (appelées Page Size Extension ) (pages de 2 Mio si vous utilisez PAE ) en plus de leurs pages standard de 4 Kio ; les processeurs x86-64 plus récents , tels que les processeurs AMD64 plus récents d' AMD et les processeurs Westmere d' Intel et les processeurs Xeon ultérieurs peuvent utiliser des pages de 1 Gio en mode long . L'IA-64 prend en charge jusqu'à huit tailles de page différentes, de 4 Kio à 256 Mio, et certaines autres architectures ont des fonctionnalités similaires.
Les pages de grande taille, bien qu'elles soient disponibles dans les processeurs utilisés dans la plupart des ordinateurs personnels contemporains , ne sont pas d'usage courant, sauf dans les applications à grande échelle, les applications que l'on trouve généralement dans les gros serveurs et dans les clusters de calcul , et dans le système d'exploitation lui-même. Généralement, leur utilisation nécessite des privilèges élevés, la coopération de l'application effectuant l'allocation volumineuse (en général, en définissant un indicateur pour demander au système d'exploitation des pages volumineuses) ou une configuration manuelle de l'administrateur ; les systèmes d'exploitation ne peuvent généralement pas, parfois de par leur conception, les paginer sur le disque.
Cependant, SGI IRIX prend en charge plusieurs tailles de page à usage général. Chaque processus individuel peut fournir des indications et le système d'exploitation utilisera automatiquement la plus grande taille de page possible pour une région donnée de l'espace d'adressage. Des travaux ultérieurs ont proposé un support transparent du système d'exploitation pour l'utilisation d'un mélange de tailles de page pour les applications non modifiées via des réservations préemptives, des promotions opportunistes, des rétrogradations spéculatives et un contrôle de fragmentation.
Linux prend en charge les pages volumineuses sur plusieurs architectures depuis la série 2.6 via le hugetlbfssystème de fichiers et sans hugetlbfsdepuis la version 2.6.38. Windows Server 2003 (SP1 et plus récent), Windows Vista et Windows Server 2008 prennent en charge les pages volumineuses sous le nom de grandes pages. Windows 2000 et Windows XP prennent en charge les grandes pages en interne, mais ne les exposent pas aux applications. La réservation de grandes pages sous Windows nécessite un droit correspondant que l'administrateur système doit accorder à l'utilisateur car les grandes pages ne peuvent pas être échangées sous Windows. À partir de la version 9, Solaris prend en charge les grandes pages sur SPARC et x86. FreeBSD 7.2-RELEASE propose des superpages. Notez que jusqu'à récemment sous Linux, les applications devaient être modifiées pour utiliser les pages volumineuses. Le noyau 2.6.38 a introduit la prise en charge de l'utilisation transparente des pages volumineuses. Sur les noyaux Linux prenant en charge les pages géantes transparentes, ainsi que sur FreeBSD et Solaris , les applications tirent automatiquement parti des pages géantes, sans nécessiter de modification.