Description du mappage de mémoire
La vitesse à laquelle les instructions d'application sont traitées sur un système est proportionnelle au nombre d'opérations d'accès nécessaires pour obtenir des données en dehors de la mémoire adressable par programme.
Le système fournit deux méthodes permettant de réduire le temps système transactionnel associé à ces opérations de lecture et d'écriture externes. Vous pouvez mapper des données de fichier dans l'espace adresse de processus. Vous pouvez également mapper des processus à des régions de mémoire anonyme qui peuvent être partagées par des processus de coopération.
Les fichiers mappés en mémoire fournissent un mécanisme permettant à un processus d'accéder à des fichiers en incorporant directement des données de fichier dans l'espace adresse du processus. L'utilisation de fichiers mappés peut réduire considérablement le transfert de données d'E-S car les données de fichier n'ont pas besoin d'être copiées dans des mémoires tampon de données de processus, comme le font les sous-routines read et write . Lorsque plusieurs processus mappent le même fichier, son contenu est partagé entre eux, ce qui permet aux processus de se synchroniser et de communiquer à l'aide d'un mécanisme à faible temps système.
Les régions de mémoire mappée, également appelées zones de mémoire partagée, peuvent servir de pool important pour l'échange de données entre les processus. Les sous-routines disponibles ne fournissent pas de verrous ni de contrôle d'accès entre les processus. Par conséquent, les processus utilisant des zones de mémoire partagée doivent configurer une méthode de contrôle de signal ou de sémaphore pour éviter les conflits d'accès et empêcher un processus de modifier les données utilisées par un autre processus. Les zones de mémoire partagée peuvent être particulièrement utiles lorsque la quantité de données à échanger entre les processus est trop importante pour être transférée avec des messages, ou lorsque de nombreux processus gèrent une base de données commune de grande taille.
Le système fournit deux méthodes de mappage des fichiers et des régions de mémoire anonyme. Les sous-routines suivantes, appelées collectivement services shmat , sont généralement utilisées pour créer et utiliser des segments de mémoire partagée à partir d'un programme:
| Sous-routine | Définition |
|---|---|
| shmctl | Contrôle les opérations de mémoire partagée |
| shmget | Extrait ou crée un segment de mémoire partagée |
| shmat | Connecte un segment de mémoire partagée à partir d'un processus. Ne vous permet pas de mapper des unités par blocs. |
| shmdt | Déconnecte un segment de mémoire partagée d'un processus |
| mprotect | Modifie les protections d'accès d'une plage d'adresses spécifiée dans un segment de mémoire partagée. |
| décliner | Supprime un mappage d'une plage d'adresses spécifiée dans un segment de mémoire partagée |
La sous-routine ftok fournit la clé que la sous-routine shmget utilise pour créer le segment partagé
Le deuxième ensemble de services, collectivement appelés services mmap , est généralement utilisé pour les fichiers de mappage, bien qu'il puisse également être utilisé pour la création de segments de mémoire partagée.
Toutes les opérations valides sur la mémoire résultant de mmap () d'un fichier sont valides sur la mémoire résultant de mmap () d'une unité par bloc. Une unité par bloc est un fichier spécial qui permet d'accéder à un pilote de périphérique qui présente une interface de bloc. Une interface de bloc vers un pilote de périphérique requiert un accès aux données dans des blocs de taille fixe. L'interface est généralement utilisée pour les périphériques de stockage de données.
Les services mmap incluent les sous-routines suivantes:
| Sous-routine | Définition |
|---|---|
| madvise | Indique au système le comportement de pagination attendu d'un processus |
| mincore | Détermine l'emplacement des pages de mémoire |
| mmap | Mappe un fichier objet dans la mémoire virtuelle. Permet de mapper les unités par bloc un processus à la fois. |
| mprotect | Modifie les protections d'accès du mappage de mémoire |
| msync | Synchronise un fichier mappé avec son unité de stockage sous-jacente |
| carte muette | Annule le mappage d'une région de mémoire mappée |
msem_init, msem_lock, msem_unlock, msem_remove, msleep, et les sous-routines mwakeup fournissent un contrôle d'accès pour les processus mappés à l'aide des services mmap .
Consultez les sections suivantes pour en savoir plus sur le mappage de mémoire:
Comparaison de mmap avec shmat
Comme pour les services shmat, la partie de l'espace d'adressage de processus disponible pour le mappage de fichiers avec les services mmap varie selon qu'un processus est un processus 32 bits ou un processus 64 bits. Pour les processus 32 bits, la partie de l'espace d'adresse disponible pour le mappage est constituée d'adresses dans la plage de0x30000000-0xCFFFFFFF, pour un total de 2.5G octets d'espace adresse. La partie de l'espace adresse disponible pour les fichiers de mappage se compose d'adresses dans la plage0x30000000-0xCFFFFFFFet0xE0000000-0xEFFFFFFFpour un total de 2.75G octets d'espace adresse. Dans AIX 5.2 et les versions ultérieures, un processus 32 bits exécuté avec le modèle de très grand espace d'adressage dispose de la plage 0x30000000-0xFFFFFFFF pour les mappages, avec un total de 3.25GB d'espace d'adressage.
Toutes les plages disponibles dans l'espace adresse de processus 32 bits sont disponibles pour les mappages à emplacement fixe et à emplacement variable. Les mappages à emplacement fixe se produisent lorsque les applications spécifient qu'un mappage doit être placé à un emplacement fixe dans l'espace adresse. Les mappages d'emplacements de variables se produisent lorsque les applications indiquent que le système doit décider de l'emplacement dans lequel un mappage doit être placé.
Pour les processus 64 bits, deux ensembles de plages d'adresses avec l'espace adresse de processus sont disponibles pour les mappages mmap ou shmat . La première, constituée de la plage unique0x07000000_00000000-0x07FFFFFF_FFFFFFFF, est disponible pour les mappages à emplacement fixe et à emplacement variable. Le deuxième ensemble de plages d'adresses est disponible uniquement pour les mappages d'emplacements fixes et comprend les plages0x30000000-0xCFFFFFFF,0xE0000000-0xEFFFFFFFet0x10_00000000-0x06FFFFFF_FFFFFFFF. La dernière plage de cet ensemble, composée de0x10_00000000-0x06FFFFFF_FFFFFFFF, est également mis à la disposition du chargeur système pour contenir le texte du programme, les données et le segment de mémoire, de sorte que seules les parties inutilisées de la plage sont disponibles pour les mappages à emplacement fixe.
Les services mmap et shmat permettent à plusieurs processus de mapper la même région d'un objet de sorte qu'ils partagent la capacité d'adressage de cet objet. Toutefois, la sous-routine mmap étend cette capacité au-delà de celle fournie par la sous-routine shmat en autorisant l'établissement d'un nombre relativement illimité de mappages de ce type. Bien que cette fonction augmente le nombre de mappages pris en charge par objet de fichier ou segment de mémoire, elle peut s'avérer inefficace pour les applications dans lesquelles de nombreux processus mappent les mêmes données de fichier dans leur espace adresse.
La sous-routine mmap fournit une adresse d'objet unique pour chaque processus mappé à un objet. Pour ce faire, le logiciel fournit à chaque processus une adresse virtuelle unique, appelée alias. La sous-routine shmat permet aux processus de partager les adresses des objets mappés.
Etant donné qu'un seul des alias existants pour une page donnée dans un objet possède une traduction d'adresse réelle à un moment donné, un seul des mappages mmap peut faire une référence à cette page sans avoir à subir de défaut de page. Toute référence à la page par un mappage différent (et donc un alias différent) entraîne un défaut de page qui entraîne l'invalidation de la conversion d'adresse réelle existante pour la page. Par conséquent, une nouvelle traduction doit être établie pour elle sous un alias différent. Les processus partagent des pages en les déplaçant entre ces différentes traductions.
Pour les applications dans lesquelles de nombreux processus mappent les mêmes données de fichier dans leur espace adresse, ce processus de basculement peut avoir un impact négatif sur les performances. Dans ces cas, la sous-routine shmat peut fournir des fonctions de mappage de fichiers plus efficaces.
Utilisez les services shmat dans les cas suivants:
- Pour une application 32 bits, onze fichiers ou moins sont mappés simultanément et chacun est inférieur à 256MB.
- Lors du mappage de fichiers dont la taille est supérieure à 256MB.
- Lors du mappage de régions de mémoire partagée qui doivent être partagées entre des processus non associés (aucune relation parent-enfant).
- Lors du mappage de fichiers entiers.
Utilisez mmap dans les cas suivants:
- La portabilité de l'application est une préoccupation.
- De nombreux fichiers sont mappés simultanément.
- Seule une partie d'un fichier doit être mappée.
- La protection au niveau de la page doit être définie sur le mappage.
- Un mappage privé est requis.
Une fonction shmatétendue est disponible pour les applications 32 bits avec leurs espaces adresse limités. Si vous définissez la variable d'environnement EXTSHM=ON, les processus qui s'exécutent dans cet environnement peuvent créer et connecter plus de onze segments de mémoire partagée. Le processus peut associer ces segments à l'espace adresse pour la taille du segment. Un autre segment peut être connecté à la fin du premier dans la même région 256M octets. L'adresse à laquelle un processus peut être joint correspond aux limites de la page, qui est un multiple de SHMLBA_EXTSHM octets.
Certaines restrictions s'appliquent à l'utilisation de la fonction shmat étendue. Ces régions de mémoire partagée ne peuvent pas être utilisées en tant que mémoires tampon d'entrée-sortie lorsque l'annulation de la mémoire tampon se produit dans un gestionnaire d'interruption. Les restrictions d'utilisation des mémoires tampon d'E-S shmat étendues sont les mêmes que celles des mémoires tampon mmap .
La variable d'environnement offre la possibilité d'exécuter une application avec la fonctionnalité supplémentaire d'association de plus de 11 segments lorsque EXTSHM=ON, ou l'accès plus performant à 11 segments ou moins lorsque la variable d'environnement n'est pas définie. Là encore, la fonction "extended shmat" s'applique uniquement aux processus 32 bits.
Remarques relatives à la compatibilité mmap
Les services mmap sont spécifiés par diverses normes et couramment utilisés comme interface de mappage de fichiers de choix dans d'autres implémentations de système d'exploitation. Toutefois, l'implémentation de la sous-routine mmap par le système peut différer des autres implémentations. La sous-routine mmap intègre les modifications suivantes:
- Le mappage dans la zone privée de processus n'est pas pris en charge.
- Les mappages ne sont pas implicitement dissociés. Une opération mmap qui spécifie MAP_FIXED échouera si un mappage existe déjà dans la plage spécifiée.
- Pour les mappages privés, la sémantique de copie sur écriture effectue une copie d'une page sur la première référence d'écriture.
- Le mappage de la mémoire d'unité ou d'entrée-sortie n'est pas pris en charge.
- Le mappage d'unités de type caractères ou l'utilisation d'une région mmap comme mémoire tampon pour une opération de lecture-écriture sur une unité de type caractères n'est pas pris en charge.
- La sous-routine madvise est fournie à des fins de compatibilité uniquement. Le système n'effectue aucune action sur les conseils indiqués.
- La sous-routine mprotect permet à la région spécifiée de contenir des pages non mappées. En fonctionnement, les pages non mappées sont simplement ignorées.
- Les options spécifiques à OSF/AES pour le mappage exact par défaut et pour les indicateurs MAP_INHERIT, MAP_HASSEMAPHOREet MAP_UNALIGNÉ ne sont pas prises en charge.
Utilisation des sous-routines de sémaphore
msem_init, msem_lock, msem_unlock, msem_remove, Les sous-routines msleep et mwakeup sont conformes à la spécification de l'environnement d'application OSF. Elles offrent une alternative aux interfaces IPC telles que les sous-routines semget et semop . Les avantages de l'utilisation des sémaphores comprennent une méthode de sérialisation efficace et la réduction de la surcharge liée au fait de ne pas avoir à effectuer d'appel système dans les cas où il n'y a pas de conflit pour le sémaphore.
Les sémaphores doivent se trouver dans une région de mémoire partagée. Les sémaphores sont spécifiés par des structures msemaphore . Toutes les valeurs d'une structure msemaphore doivent résulter d'un appel de sous-routine msem_init . Cet appel peut être suivi ou non d'une séquence d'appels à la sous-routine msem_lock ou à la sous-routine msem_unlock . Si les valeurs d'une structure msemaphore proviennent d'une autre manière, les résultats des sous-routines de sémaphore ne sont pas définis.
L'adresse de la structure msemaphore est significative. Veillez à ne pas modifier l'adresse de la structure. Si la structure contient des valeurs copiées à partir d'une structure msemaphore à une autre adresse, les résultats des sous-routines de sémaphore ne sont pas définis.
Les sous-routines de sémaphore peuvent s'avérer moins efficaces lorsque les structures de sémaphore existent dans des régions de mémoire anonyme créées avec la sous-routine mmap , en particulier dans les cas où de nombreux processus font référence aux mêmes sémaphores. Dans ces cas, les structures de sémaphore doivent être allouées à partir des régions de mémoire partagée créées avec les sous-routines shmget et shmat .
Mappage de fichiers avec la sous-routine shmat
Le mappage peut être utilisé pour réduire la surcharge liée à l'écriture et à la lecture du contenu des fichiers. Une fois que le contenu d'un fichier est mappé à une zone de la mémoire de l'utilisateur, le fichier peut être manipulé comme s'il s'agissait de données en mémoire, en utilisant des pointeurs vers ces données au lieu d'appels d'entrée/sortie. La copie du fichier sur le disque sert également de zone de pagination pour ce fichier, ce qui permet d'économiser de l'espace de pagination.
Un programme peut utiliser n'importe quel fichier standard comme fichier de données mappé. Vous pouvez également étendre les fonctions des fichiers de données mappés aux fichiers contenant du code d'objet compilé et exécutable. Etant donné que les fichiers mappés sont accessibles plus rapidement que les fichiers standard, le système peut charger un programme plus rapidement si son fichier d'objet exécutable est mappé à un fichier.
Pour créer un programme en tant que fichier exécutable mappé, compilez et liez le programme à l'aide de l'indicateur -K avec la commande cc ou ld . L'indicateur -K indique à l'éditeur de liens de créer un fichier objet avec un format aligné sur la page. C'est-à-dire que chaque partie du fichier objet commence sur une limite de page (une adresse qui peut être divisée par 2K octets sans reste). Cette option génère un espace vide dans le fichier objet, mais permet de mapper le fichier exécutable en mémoire. Lorsque le système mappe un fichier objet dans la mémoire, les parties texte et données sont traitées différemment.
Copie sur écriture de fichiers mappés
Pour éviter que les modifications apportées aux fichiers mappés n'apparaissent immédiatement dans le fichier sur le disque, mappez le fichier en tant que fichier de copie sur écriture. Cette option crée un fichier mappé avec les modifications qui sont sauvegardées dans l'espace de pagination du système, au lieu de la copie du fichier sur le disque. Vous devez choisir d'écrire ces modifications dans la copie sur le disque pour sauvegarder les modifications. Sinon, vous perdez les modifications lors de la fermeture du fichier.
Etant donné que les modifications ne sont pas immédiatement reflétées dans la copie du fichier à laquelle les autres utilisateurs peuvent accéder, utilisez des fichiers mappés de copie sur écriture uniquement parmi les processus qui coopèrent entre eux.
Le système ne détecte pas la fin des fichiers mappés à la sous-routine shmat . Par conséquent, si un programme écrit au-delà de la fin de fichier en cours dans un fichier mappé de copie sur écriture en le stockant dans le segment de mémoire correspondant (où le fichier est mappé), le fichier réel sur le disque est étendu avec des blocs de zéros en préparation des nouvelles données. Si le programme n'utilise pas la sous-routine fsync avant de fermer le fichier, les données écrites au-delà de la fin de fichier précédente ne sont pas écrites sur le disque. Le fichier apparaît plus grand, mais ne contient que les zéros ajoutés. Par conséquent, utilisez toujours la sous-routine fsync avant de fermer un fichier mappé de copie sur écriture pour conserver les données ajoutées ou modifiées.
Mappage de segments de mémoire partagée avec la sous-routine shmat
Le système utilise des segments de mémoire partagée de la même manière que la façon dont il crée et utilise les fichiers. La définition des termes utilisés pour la mémoire partagée par rapport aux termes plus familiers du système de fichiers est essentielle à la compréhension de la mémoire partagée. La liste de définitions des termes de mémoire partagée est la suivante:
| Terme | Définition |
|---|---|
| key | Identificateur unique d'un segment partagé particulier. Il est associé au segment partagé tant que le segment partagé existe. A cet égard, il est similaire au nom de fichier d'un fichier. |
| ID mémoire partagée | Identificateur affecté au segment partagé à utiliser dans un processus particulier. Il est similaire à un descripteur de fichier pour un fichier. |
| joindre | Indique qu'un processus doit associer un segment partagé pour pouvoir l'utiliser. L'association d'un segment partagé est similaire à l'ouverture d'un fichier. |
| détacher | Indique qu'un processus doit déconnecter un segment partagé une fois qu'il est terminé de l'utiliser. La déconnexion d'un segment partagé est similaire à la fermeture d'un fichier. |