Alors les gars, discutons maintenant de notre premier exemple de démonstration qui utilise l'appel système map.
Voici donc l'exemple dans lequel je vais vous montrer comment un appel système map peut être utilisé simplement pour faire
de l'allocation dynamique de mémoire.
Vous utilisez normalement le catalogue malloc ou l'opérateur new pour l'allocation dynamique de mémoire dans votre programme.
Notez donc que MAP est un appel système polyvalent.
Il peut faire beaucoup de choses à partir de ces nombreux éléments.
Il peut également être utilisé pour l'allocation dynamique de mémoire, tout comme vous utilisez les appels système
catalog et malloc.
D'accord.
Le fait qu'une carte n'ait pas été spécialement conçue à cette fin est une chose différente.
C'est simplement que l'appel système map peut également être utilisé pour l'allocation dynamique de mémoire.
Voici donc le programme dans lequel je vais vous montrer comment un appel système map peut être utilisé pour allouer une
mémoire dynamique à votre programme.
Vous pouvez donc voir, tout d'abord, qu'il s'agit du prototype de l'appel système map.
Il prend combien d'arguments - un, deux, trois, quatre, cinq et six - et renvoie une étoile
large.
D'accord.
Et pour annuler l'opération de l'appel système de la carte, vous avez un appel système de la carte.
Dans cet exemple, nous allons donc discuter en détail de chacun de ces arguments
et de leur fonction.
D'accord.
Comme je l'ai dit dans cet exemple, nous allons simplement utiliser un appel système map pour allouer dynamiquement une partie de la mémoire
à votre programme, tout comme vous l'auriez fait, tout comme vous l'auriez fait en utilisant malloc ou des appels de
couleur à la place.
Vous pouvez donc voir ici qu'immédiatement après la fonction principale, j'invoque l'appel système map.
Le premier argument de l'appel système à la carte est Wild Star.
Le premier argument tente donc de donner un contrôle au développeur : si je veux une allocation de mémoire, la nouvelle mémoire
que j'obtiendrai doit commencer par cette adresse.
En tant que développeur, vous devez donc fournir une adresse.
D'accord.
Mais nous passons null pour que votre système d'exploitation alloue une mémoire dynamique à partir du tas
et vous renvoie un pointeur sur cette mémoire.
D'accord.
Par ailleurs, en tant que développeur, vous pouvez également spécifier que si vous demandez une mémoire dynamique au système d'exploitation
à l'aide d'un appel système "map", alors à partir de quelle adresse, de quelle adresse virtuelle ce morceau de mémoire
doit-il commencer ?
Lorsque vous utilisez les appels malloc ou color, vous utilisez généralement ces appels qui sont Kellog et Maalox ne
fournissent pas la possibilité au développeur de spécifier l'adresse de son choix, mais un système de carte appelé le fait.
D'accord.
Nous allions comprendre plus tard dans quels cas le développeur aurait besoin de fournir le premier argument
à l'appel système map pour l'instant, il suffit de le passer en tant que null.
Le deuxième argument est la taille de la mémoire en octets que vous souhaitez allouer.
Le deuxième argument est donc assez simple.
Le troisième argument est un ensemble de drapeaux dont vous avez besoin pour spécifier que la mémoire que vous demandez à l'aide d'un
appel système map peut être de la mémoire en lecture seule ou de la mémoire en lecture seule.
Si votre programme veut seulement lire cette mémoire et ne pas la modifier, il doit fournir
ce drapeau qui est amené underscore read.
Dans le cas contraire, si votre programme souhaite effectuer des opérations de lecture et d'écriture, vous
devez fournir les deux drapeaux qui sont concaténés ensemble à l'aide de notre opérateur.
D'accord.
C'est donc le troisième argument.
Le quatrième argument est donc, à nouveau, une collection de drapeaux qui peuvent être concaténés avec l'opérateur
our.
Vous pouvez maintenant spécifier une carte, une carte privée, une carte anonyme.
La troisième valeur est la carte partagée.
Bien sûr, il existe d'autres valeurs que vous pouvez spécifier, mais ce sont les valeurs les plus couramment
utilisées.
Lorsque vous dites "map private", cela signifie simplement que la mémoire dynamique attribuée à votre processus ne peut
être partagée par aucun autre processus du système.
Revenons à la diapositive.
Ici, si le processus est un, il utilise l'appel système map pour réserver ces pages de mémoire virtuelle colorées en vert dans
sa mémoire virtuelle.
Le processus p two ne peut donc pas accéder aux mêmes pages physiques à l'aide d'un appel système map.
D'accord.
Parce que la mémoire allouée par votre processus 1 à l'aide de l'appel système map a utilisé map private comme
drapeau.
D'accord.
Ainsi, dans cet exemple, le processus P two ne peut pas partager les mêmes pages physiques dans la RAM car le premier créateur
de la mémoire.
Le P.
Le processus p un.
Création de ces pages de mémoire virtuelle à l'aide d'un appel système map en spécifiant map private comme drapeau.
D'accord, puis vous pouvez le concaténer avec Map Anonymous, ce qui est une façon de dire que les pages physiques
qui sont créées.
Dans la mémoire vive, il n'y a pas de correspondance avec une source de données externe telle qu'un fichier texte.
C'est vrai.
Nous avons discuté du fait que l'utilisation d'une source de données externe est facultative dans ce cas.
Le RAM lui-même est utilisé comme source de données externe.
Nous avons vu dans le dernier segment de la mémoire partagée que la RAM elle-même peut être utilisée comme source de données.
D'accord.
Si c'est le cas, vous pouvez toujours spécifier une carte anonyme et les deux derniers arguments.
C'est-à-dire qu'il s'agit d'une valeur entière.
D'accord.
Cette valeur entière est donc un descripteur de fichier d'une source externe de mémoire.
Je vais vous montrer un exemple de démonstration dans lequel nous allons mapper la source externe en utilisant l'appel
système map.
Dans cet exemple, il n'y a pas de source externe de mémoire, vous pouvez donc toujours la spécifier à zéro.
Le dernier argument est une valeur de décalage qui est nécessaire si vous utilisez une source externe de mémoire.
Ici, nous n'avons pas de source externe de mémoire.
Vous pouvez alors spécifier qu'il s'agit de zéro.
Les deux derniers arguments sont donc consacrés à la source externe de la mémoire.
Si nous essayons de cartographier ou d'importer cette source externe de mémoire et vers le processus qui adressera
l'espace à l'aide d'une carte.
Il s'agit donc d'une description de tous les arguments de l'appel système map.
Maintenant, lorsque l'appel système map est exécuté parfaitement, c'est-à-dire qu'il est réussi.
Il renvoie ensuite le pointeur vers la mémoire allouée à votre programme.
D'accord.
Tout comme Gallagher, Matlock renvoie un pointeur.
Et vous pouvez toujours vérifier ce point de valeur.
Si la valeur de ce pointeur est égale à Mapp fail, qui est une valeur de contrainte non valide dans le fichier
d'en-tête size slash M&A attach, vous devez inclure ce fichier d'en-tête pour pouvoir utiliser un appel système map.
L'allocation de la mémoire a échoué.
Pour une raison X-Y-Z, vous pouvez toujours imprimer.
La variable, la variable, la valeur de la variable globale.
Ajoutez un chiffre pour voir le code, qui vous dira que pour quelle raison ?
La mémoire est défaillante.
Il s'agit d'une variable globale et pour l'utiliser, il suffit d'inclure le fichier
d'en-tête, le numéro d'erreur, le bord du point, n'est-ce pas ?
Et quel que soit le code d'erreur qu'il produit, vous pouvez toujours aller sur Google et rechercher ce code pour le voir.
Quelle est la raison de la défaillance de la mémoire ?
L'allocation de mémoire a échoué.
C'est le cas maintenant.
Mais à la ligne 37, votre programme a alloué de la mémoire dynamique et vous pouvez faire ce que vous voulez
avec cette mémoire.
Vous pouvez lire ou écrire dans cette mémoire, comme vous le feriez si vous disposiez d'une mémoire demandée
à partir de malloc ou d'appels.
Ici, j'écris simplement quelques chiffres dans cette mémoire, et une fois que j'en ai terminé avec cette mémoire,
j'invoque simplement un appel et une carte.
Donc ici, je suis dans map, c'est comme si vous libériez la mémoire que vous aviez allouée à l'aide d'un appel
système map.
Ainsi, l'option "Je suis sur la carte" est simplement l'inverse d'un appel système à la carte.
Vous transmettez ici le pointeur qui a été renvoyé par un appel système de la carte.
Il n'est pas possible de passer un pointeur arbitraire ici.
Vous devez transmettre le pointeur renvoyé par l'appel système map et la quantité de mémoire
que vous avez demandée.
En le contournant comme second argument de l'appel système map.
D'accord.
Le système non mappé appelé libère donc simplement la mémoire.
D'accord.
Les pages de mémoire virtuelle créées à l'aide de l'appel système map sont supprimées.
Et lorsque les pages de mémoire virtuelle sont détruites, la table des pages du processus est également mise à jour pour détruire
ces mappages.
Les pages de mémoire physique de la RAM sont également détruites ou libérées.
D'accord.
Vous demandez donc simplement, disons, une dizaine d'octets de mémoire, alors que la taille de la
page de mémoire virtuelle est très grande, comme c'est le cas pour 096 octets.
Vous pouvez donc simplement compiler et exécuter ce programme.
Il s'agit d'un programme très simple.
Dans cet exercice, je vous ai expliqué les paramètres que l'appel système map prend.
Dans la prochaine vidéo, nous allons nous exercer à une utilisation plus avancée de l'appel système
map et voir comment nous pouvons implémenter la mémoire partagée en utilisant un appel système map.