WEBVTT

00:07.280 --> 00:14.000
Alors les gars, discutons maintenant de notre premier exemple de démonstration qui utilise l'appel système map.

00:14.480 --> 00:21.890
Voici donc l'exemple dans lequel je vais vous montrer comment un appel système map peut être utilisé simplement pour faire

00:21.890 --> 00:24.650
de l'allocation dynamique de mémoire.

00:25.370 --> 00:32.630
Vous utilisez normalement le catalogue malloc ou l'opérateur new pour l'allocation dynamique de mémoire dans votre programme.

00:33.050 --> 00:36.530
Notez donc que MAP est un appel système polyvalent.

00:36.530 --> 00:39.400
Il peut faire beaucoup de choses à partir de ces nombreux éléments.

00:39.410 --> 00:45.920
Il peut également être utilisé pour l'allocation dynamique de mémoire, tout comme vous utilisez les appels système

00:45.920 --> 00:47.480
catalog et malloc.

00:47.960 --> 00:48.530
D'accord.

00:48.570 --> 00:53.280
Le fait qu'une carte n'ait pas été spécialement conçue à cette fin est une chose différente.

00:53.300 --> 00:58.610
C'est simplement que l'appel système map peut également être utilisé pour l'allocation dynamique de mémoire.

00:59.780 --> 01:05.930
Voici donc le programme dans lequel je vais vous montrer comment un appel système map peut être utilisé pour allouer une

01:05.930 --> 01:07.910
mémoire dynamique à votre programme.

01:08.810 --> 01:13.250
Vous pouvez donc voir, tout d'abord, qu'il s'agit du prototype de l'appel système map.

01:13.250 --> 01:20.270
Il prend combien d'arguments - un, deux, trois, quatre, cinq et six - et renvoie une étoile

01:20.300 --> 01:20.930
large.

01:21.260 --> 01:21.890
D'accord.

01:21.950 --> 01:27.860
Et pour annuler l'opération de l'appel système de la carte, vous avez un appel système de la carte.

01:28.100 --> 01:33.500
Dans cet exemple, nous allons donc discuter en détail de chacun de ces arguments

01:33.500 --> 01:35.840
et de leur fonction.

01:36.350 --> 01:36.890
D'accord.

01:39.140 --> 01:46.460
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

01:46.460 --> 01:52.640
à votre programme, tout comme vous l'auriez fait, tout comme vous l'auriez fait en utilisant malloc ou des appels de

01:52.640 --> 01:54.050
couleur à la place.

01:54.800 --> 02:01.430
Vous pouvez donc voir ici qu'immédiatement après la fonction principale, j'invoque l'appel système map.

02:01.940 --> 02:05.920
Le premier argument de l'appel système à la carte est Wild Star.

02:05.930 --> 02:13.610
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

02:13.610 --> 02:17.470
que j'obtiendrai doit commencer par cette adresse.

02:17.480 --> 02:20.840
En tant que développeur, vous devez donc fournir une adresse.

02:21.050 --> 02:21.650
D'accord.

02:22.040 --> 02:30.680
Mais nous passons null pour que votre système d'exploitation alloue une mémoire dynamique à partir du tas

02:30.680 --> 02:34.640
et vous renvoie un pointeur sur cette mémoire.

02:35.120 --> 02:35.760
D'accord.

02:35.780 --> 02:43.250
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

02:43.250 --> 02:49.670
à l'aide d'un appel système "map", alors à partir de quelle adresse, de quelle adresse virtuelle ce morceau de mémoire

02:49.670 --> 02:52.010
doit-il commencer ?

02:53.460 --> 02:59.910
Lorsque vous utilisez les appels malloc ou color, vous utilisez généralement ces appels qui sont Kellog et Maalox ne

02:59.910 --> 03:06.840
fournissent pas la possibilité au développeur de spécifier l'adresse de son choix, mais un système de carte appelé le fait.

03:07.290 --> 03:07.890
D'accord.

03:07.890 --> 03:14.400
Nous allions comprendre plus tard dans quels cas le développeur aurait besoin de fournir le premier argument

03:14.400 --> 03:19.140
à l'appel système map pour l'instant, il suffit de le passer en tant que null.

03:20.340 --> 03:26.820
Le deuxième argument est la taille de la mémoire en octets que vous souhaitez allouer.

03:27.090 --> 03:29.730
Le deuxième argument est donc assez simple.

03:30.610 --> 03:37.110
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

03:37.120 --> 03:41.920
appel système map peut être de la mémoire en lecture seule ou de la mémoire en lecture seule.

03:41.920 --> 03:48.220
Si votre programme veut seulement lire cette mémoire et ne pas la modifier, il doit fournir

03:48.220 --> 03:51.880
ce drapeau qui est amené underscore read.

03:52.480 --> 03:58.030
Dans le cas contraire, si votre programme souhaite effectuer des opérations de lecture et d'écriture, vous

03:58.030 --> 04:02.800
devez fournir les deux drapeaux qui sont concaténés ensemble à l'aide de notre opérateur.

04:03.460 --> 04:04.090
D'accord.

04:04.750 --> 04:06.580
C'est donc le troisième argument.

04:07.120 --> 04:15.160
Le quatrième argument est donc, à nouveau, une collection de drapeaux qui peuvent être concaténés avec l'opérateur

04:15.160 --> 04:16.360
our.

04:16.870 --> 04:21.370
Vous pouvez maintenant spécifier une carte, une carte privée, une carte anonyme.

04:21.370 --> 04:24.010
La troisième valeur est la carte partagée.

04:24.370 --> 04:29.410
Bien sûr, il existe d'autres valeurs que vous pouvez spécifier, mais ce sont les valeurs les plus couramment

04:29.410 --> 04:30.040
utilisées.

04:30.550 --> 04:37.480
Lorsque vous dites "map private", cela signifie simplement que la mémoire dynamique attribuée à votre processus ne peut

04:37.720 --> 04:40.840
être partagée par aucun autre processus du système.

04:41.560 --> 04:43.840
Revenons à la diapositive.

04:45.200 --> 04:51.860
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

04:51.860 --> 04:53.180
sa mémoire virtuelle.

04:53.570 --> 05:00.740
Le processus p two ne peut donc pas accéder aux mêmes pages physiques à l'aide d'un appel système map.

05:01.310 --> 05:01.880
D'accord.

05:01.880 --> 05:11.060
Parce que la mémoire allouée par votre processus 1 à l'aide de l'appel système map a utilisé map private comme

05:11.060 --> 05:12.140
drapeau.

05:12.830 --> 05:13.370
D'accord.

05:15.190 --> 05:23.140
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

05:23.140 --> 05:24.520
de la mémoire.

05:24.520 --> 05:25.450
Le P.

05:25.480 --> 05:26.860
Le processus p un.

05:27.720 --> 05:34.950
Création de ces pages de mémoire virtuelle à l'aide d'un appel système map en spécifiant map private comme drapeau.

05:36.570 --> 05:45.720
D'accord, puis vous pouvez le concaténer avec Map Anonymous, ce qui est une façon de dire que les pages physiques

05:45.720 --> 05:47.310
qui sont créées.

05:48.550 --> 05:54.040
Dans la mémoire vive, il n'y a pas de correspondance avec une source de données externe telle qu'un fichier texte.

05:55.260 --> 05:55.800
C'est vrai.

05:56.090 --> 06:01.640
Nous avons discuté du fait que l'utilisation d'une source de données externe est facultative dans ce cas.

06:01.640 --> 06:05.000
Le RAM lui-même est utilisé comme source de données externe.

06:06.790 --> 06:12.700
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.

06:13.270 --> 06:13.840
D'accord.

06:13.840 --> 06:21.880
Si c'est le cas, vous pouvez toujours spécifier une carte anonyme et les deux derniers arguments.

06:22.630 --> 06:25.660
C'est-à-dire qu'il s'agit d'une valeur entière.

06:27.060 --> 06:27.480
D'accord.

06:27.480 --> 06:33.000
Cette valeur entière est donc un descripteur de fichier d'une source externe de mémoire.

06:33.750 --> 06:39.540
Je vais vous montrer un exemple de démonstration dans lequel nous allons mapper la source externe en utilisant l'appel

06:39.540 --> 06:40.440
système map.

06:40.470 --> 06:45.450
Dans cet exemple, il n'y a pas de source externe de mémoire, vous pouvez donc toujours la spécifier à zéro.

06:45.660 --> 06:53.490
Le dernier argument est une valeur de décalage qui est nécessaire si vous utilisez une source externe de mémoire.

06:53.520 --> 06:55.860
Ici, nous n'avons pas de source externe de mémoire.

06:55.860 --> 06:57.840
Vous pouvez alors spécifier qu'il s'agit de zéro.

06:58.890 --> 07:02.640
Les deux derniers arguments sont donc consacrés à la source externe de la mémoire.

07:02.640 --> 07:08.120
Si nous essayons de cartographier ou d'importer cette source externe de mémoire et vers le processus qui adressera

07:08.130 --> 07:09.600
l'espace à l'aide d'une carte.

07:10.380 --> 07:14.370
Il s'agit donc d'une description de tous les arguments de l'appel système map.

07:15.660 --> 07:21.210
Maintenant, lorsque l'appel système map est exécuté parfaitement, c'est-à-dire qu'il est réussi.

07:21.210 --> 07:24.990
Il renvoie ensuite le pointeur vers la mémoire allouée à votre programme.

07:25.500 --> 07:26.160
D'accord.

07:27.190 --> 07:29.770
Tout comme Gallagher, Matlock renvoie un pointeur.

07:30.100 --> 07:32.620
Et vous pouvez toujours vérifier ce point de valeur.

07:32.620 --> 07:38.320
Si la valeur de ce pointeur est égale à Mapp fail, qui est une valeur de contrainte non valide dans le fichier

07:38.320 --> 07:45.250
d'en-tête size slash M&amp;A attach, vous devez inclure ce fichier d'en-tête pour pouvoir utiliser un appel système map.

07:45.250 --> 07:47.320
L'allocation de la mémoire a échoué.

07:47.320 --> 07:51.430
Pour une raison X-Y-Z, vous pouvez toujours imprimer.

07:53.180 --> 07:56.270
La variable, la variable, la valeur de la variable globale.

07:56.270 --> 08:03.890
Ajoutez un chiffre pour voir le code, qui vous dira que pour quelle raison ?

08:03.890 --> 08:05.270
La mémoire est défaillante.

08:05.300 --> 08:11.000
Il s'agit d'une variable globale et pour l'utiliser, il suffit d'inclure le fichier

08:12.470 --> 08:16.850
d'en-tête, le numéro d'erreur, le bord du point, n'est-ce pas ?

08:16.850 --> 08:22.430
Et quel que soit le code d'erreur qu'il produit, vous pouvez toujours aller sur Google et rechercher ce code pour le voir.

08:22.430 --> 08:24.830
Quelle est la raison de la défaillance de la mémoire ?

08:24.830 --> 08:26.480
L'allocation de mémoire a échoué.

08:28.370 --> 08:29.360
C'est le cas maintenant.

08:30.350 --> 08:36.260
Mais à la ligne 37, votre programme a alloué de la mémoire dynamique et vous pouvez faire ce que vous voulez

08:36.260 --> 08:37.910
avec cette mémoire.

08:37.910 --> 08:43.910
Vous pouvez lire ou écrire dans cette mémoire, comme vous le feriez si vous disposiez d'une mémoire demandée

08:43.910 --> 08:45.650
à partir de malloc ou d'appels.

08:45.890 --> 08:52.310
Ici, j'écris simplement quelques chiffres dans cette mémoire, et une fois que j'en ai terminé avec cette mémoire,

08:52.310 --> 08:55.100
j'invoque simplement un appel et une carte.

08:55.100 --> 09:01.550
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

09:01.550 --> 09:02.450
système map.

09:02.750 --> 09:06.890
Ainsi, l'option "Je suis sur la carte" est simplement l'inverse d'un appel système à la carte.

09:06.920 --> 09:10.970
Vous transmettez ici le pointeur qui a été renvoyé par un appel système de la carte.

09:11.180 --> 09:13.760
Il n'est pas possible de passer un pointeur arbitraire ici.

09:14.450 --> 09:19.730
Vous devez transmettre le pointeur renvoyé par l'appel système map et la quantité de mémoire

09:19.730 --> 09:21.440
que vous avez demandée.

09:22.860 --> 09:26.460
En le contournant comme second argument de l'appel système map.

09:26.790 --> 09:27.360
D'accord.

09:27.360 --> 09:31.230
Le système non mappé appelé libère donc simplement la mémoire.

09:31.890 --> 09:32.430
D'accord.

09:32.430 --> 09:37.800
Les pages de mémoire virtuelle créées à l'aide de l'appel système map sont supprimées.

09:37.890 --> 09:45.030
Et lorsque les pages de mémoire virtuelle sont détruites, la table des pages du processus est également mise à jour pour détruire

09:45.030 --> 09:46.160
ces mappages.

09:46.170 --> 09:50.880
Les pages de mémoire physique de la RAM sont également détruites ou libérées.

09:51.710 --> 09:52.280
D'accord.

09:53.670 --> 09:59.280
Vous demandez donc simplement, disons, une dizaine d'octets de mémoire, alors que la taille de la

09:59.280 --> 10:03.810
page de mémoire virtuelle est très grande, comme c'est le cas pour 096 octets.

10:08.320 --> 10:10.910
Vous pouvez donc simplement compiler et exécuter ce programme.

10:10.930 --> 10:12.610
Il s'agit d'un programme très simple.

10:12.700 --> 10:19.870
Dans cet exercice, je vous ai expliqué les paramètres que l'appel système map prend.

10:19.960 --> 10:25.540
Dans la prochaine vidéo, nous allons nous exercer à une utilisation plus avancée de l'appel système

10:25.540 --> 10:31.690
map et voir comment nous pouvons implémenter la mémoire partagée en utilisant un appel système map.
