Que signifie «carte»?

10

J'ai rencontré le terme à plusieurs reprises, dans divers supports pédagogiques CS:

  1. L2 CS162 (UC Berkeley):

    E / S mappées en mémoire

  2. L4 CS162 (UC Berkeley):

    Fichiers mappés en mémoire

  3. L24 CS61 (UC Berkeley):

    «E / S mappées en mémoire»: contrôle de périphérique / registres de données mappés sur l'espace d'adressage du processeur

  4. Même, après avoir googlé la "cartographie", j'ai eu l'article Map_ (fonction d'ordre supérieur) , mais ce n'était pas très clair pour moi.
  5. Encore plus, j'ai essayé de comprendre le sens dans le contexte de la bitmaplecture de l'article Wikipedia :

    Un tableau de bits est un mappage d'un domaine (presque toujours une plage d'entiers) aux valeurs de l'ensemble {0, 1}

    Je ne suis pas sûr, mais dans le contexte ci-dessus, cela me semble sur la conversion des données.

  6. Plus tard, après avoir lu un livre CS, je n'ai trouvé que ce paragraphe, mais il n'a pas expliqué le sens de «mappage» pour moi:

    Mappage de mémoire Linux (avec d'autres formes d'Unix) initialise le contenu d'une zone de mémoire virtuelle en l'associant à un objet sur le disque, un processus connu sous le nom de mappage de mémoire.

  7. J'ai également obtenu MapReduce comme résultat de recherche: où la carte est expliquée comme "un idiome dans le calcul parallèle où une opération simple est appliquée à tous les éléments d'une séquence, potentiellement en parallèle".

Je suis toujours confus au sujet du terme. Quelqu'un peut-il expliquer ce que signifie «carte» dans les contextes que j'ai mentionnés?

Kais
la source

Réponses:

14

Donc, il y a deux utilisations distinctes du mot "carte", que je décompresserai ici.

  1. FX2XX.F(X)=2X

    Cette utilisation inclut "IO mappé en mémoire:" il existe une fonction (conceptuelle) associant chaque morceau de mémoire à une action IO particulière. Personne n'écrit jamais la fonction, mais elle est bel et bien là: pour chaque morceau de mémoire mappée, il y a des IO associés. Peut-être une partie d'un disque, peut-être un registre matériel sur un périphérique, etc.

    De même, les tableaux de bits (et les tableaux en général) entrent dans cette catégorie: chaque index a un seul élément qui lui est associé (à un moment donné), donc un tableau est effectivement un codage d'une fonction de domaine fini.

  2. Dans la programmation fonctionnelle et les dérivés (tels que MapReduce), map fait référence à l'application d'une transformation à travers une structure.

    L'original mapvient de Lisp, où il faisait référence à la fonction qui prenait une autre fonction et une liste, et renvoyait le résultat de l'application de la fonction à chaque élément de cette liste.

    Mais, ce phénomène est assez général. Dans Haskell, une structure de données qui admet une telle opération est appelée un foncteur , et l'opération est appelée fmap (pour des raisons historiques, pour éviter les conflits avec la carte de liste).

    Tous ces éléments sont liés à travers le concept d'un foncteur de la théorie des catégories, qui est une abstraction de structures admettant une opération de "carte".

jmite
la source
4
(Typo dans le Functornom du lien - trop peu pour suggérer une modification.)
Mat
Explication très claire et excellente. Cependant, je ne comprenais pas ce que signifie «fonction finie».
Kais
1
La `` fonction finie '' de @Kais est le plus souvent utilisée pour une fonction pour laquelle aucun élément n'est mappé à l'infini. Je suppose que jmite voulait souligner que les tableaux sont essentiellement des fonctions mappant l'ensemble d'indices (valides) aux valeurs contenues.
Michael Hoff
2
Les deux utilisations ne sont vraiment que des aspects de la même chose. La mapfonction renvoie un résultat où chaque élément est associé à l'élément correspondant de l'entrée. La distinction est que la première utilisation décrit une relation existante, tandis que la seconde fait référence à une opération qui crée la relation.
Barmar
1
Typo: Fucntor
Barmar
8

Dans ce qui suit, je vais être loin d'être précis à plusieurs égards, sacrifiant la précision technique pour fournir une compréhension de base. Il est évident que vous avez lu un certain nombre de sources techniques et la technicité même du matériel rend difficile pour vous de comprendre ce qui est un concept assez basique et simple.

En termes simples, l'utilisation la plus courante du mot map est de décrire une relation entre les choses dans deux ensembles différents. Il peut s'agir d'une fonction mathématique ou d'un autre type de représentation et de mécanisme. Le plus courant qui me vient immédiatement à l'esprit est le plan des rues.

Une carte de rue est une image d'un terrain ou d'une zone particulière dans le monde réel dans laquelle les lignes et les dessins et les mots écrits sur la carte correspondent à des rues et des bâtiments physiques réels. Il existe une relation un à un entre la représentation du terrain représenté sur le plan des rues et le terrain réel.

En regardant plus loin, nous pouvons également voir qu'un plan des rues est une représentation du terrain réel. Le terrain réel a des objets et des détails et des processus dynamiques que le plan des rues ne représente pas. Le plan des rues est une représentation abstraite du terrain réel et ce qui est représenté sur le plan des rues n'est que ce qui est nécessaire pour remplir son objectif, fournir une aide à la navigation pour le terrain réel.

Un certain nombre d'exemples dans la question impliquent la création d'une représentation avec des mécanismes de soutien afin qu'une personne puisse utiliser la représentation et le mécanisme traduit les actions de la personne en ce qui est nécessaire pour la fonctionnalité sous-jacente qui est cachée par la façade de la représentation.

Les E / S de fichiers mappés en mémoire permettent à un programmeur de considérer un fichier comme une grande zone de mémoire, d'utiliser une représentation en mémoire d'un fichier réel. Le programmeur ne considère pas le fichier comme un fichier mais le considère plutôt comme une grande zone de mémoire. La fonctionnalité d'E / S de fichier mappé en mémoire veille à ce que lorsque le programmeur fait référence à un décalage de mémoire particulier, les données correspondantes du fichier soient accessibles.

Les E / S de périphérique mappé en mémoire permettent de simplifier une interface de programmation de périphérique en écrivant dans des adresses mémoire ou en lisant des adresses mémoire. Ces actions d'écriture et de lecture sont traduites par la fonctionnalité d'E / S de périphérique mappé en mémoire sous-jacente en actions spécifiques au périphérique réelles nécessaires pour exécuter le service ou l'action demandée.

Une mappe de bits est un ensemble de bits qui fournissent une correspondance un à un avec les valeurs d'un autre ensemble. Par exemple, la CreateFile()fonction de l'API Win32 a plusieurs arguments de mappage de bits qui sont utilisés pour indiquer différents types d'attributs de fichier. Des bits spécifiques dans une mappe de bits correspondent à un comportement de fichier spécifique tel que «Ouvrir en lecture seule» ou «Toujours créer un nouveau fichier vide». Des constantes spéciales sont fournies qui sont combinées à l'aide d'opérations binaires pour spécifier les arguments réels. Voir Fonction CreateFile et l'exemple de code source dans Ouverture d'un fichier en lecture ou en écriture .

Richard Chambers
la source
Grande explication. Cependant, concernant le Memory mapped file I/O, est-ce une alternative aux E / S de fichiers standard (fopen, fgetc ..)? l'avantage de performance est-il dû à la nature de l'accès RAM plus rapide par rapport aux disques?
Kais
1
@Kais Memory Mapped File I / O (MMF) est une alternative à l'utilisation des appels d'API de fichier standard. Il peut y avoir ou non un avantage de performance à utiliser MMF. Cela dépend vraiment de la façon dont la mécanique de MMF s'adapte à la façon dont vous utilisez le contenu du fichier ainsi que de la taille du fichier. Les E / S MMF mettent en pages les zones du fichier en mémoire en gros blocs. Vous pouvez faire quelque chose de similaire avec l'API de fichiers et faire une différence de performances significative. Avec les E / S d'API de fichiers standard, il y a généralement beaucoup de copie entre les tampons de mémoire de l'espace du noyau vers l'espace utilisateur qui est souvent contourné avec MMF.
Richard Chambers
1
@Kais pas sûr de ce que vous demandez. La copie de données d'un emplacement mémoire à un autre prend du temps et des cycles de processeur, donc la réduction de la copie des données améliore les performances lors de l'accès aux données. Les E / S de fichiers sont à usage général et effectuent en interne leur propre mise en cache et pagination du contenu des fichiers, mais la taille des tampons de mémoire est généralement plus petite que celle utilisée avec les E / S de fichiers mappés en mémoire. L'API de fichier tend à être orientée vers la promotion des E / S de petits morceaux plutôt que de gros blocs. L'accès séquentiel a tendance à être privilégié avec un regard en avant dans la pile d'E / S de fichiers et le noyau.
Richard Chambers
1
@Kais, donc si vous pouvez fournir un indice à l'API d'E / S de fichiers, vous pouvez améliorer les performances de votre application qui utilise l'API d'E / S de fichiers lorsque les E / S de fichiers sont un goulot d'étranglement des performances. Et l'utilisation d'E / S de fichiers mappés en mémoire peut également aider, en particulier avec un accès et des opérations principalement séquentiels dans une seule taille de page MMF. Voir le matériel et les liens à cette URL sur les E / S de bas niveau avec GNU C gnu.org/software/libc/manual/html_node/… qui décrivent certaines des mécaniques de niveau inférieur de GNU.
Richard Chambers
1
@Kais J'ai constaté des améliorations significatives des performances avec l'API de fichiers de la bibliothèque standard C en utilisant la setbuf()fonction pour définir un grand tampon d'E / S de fichiers. Tout ce que vous pouvez faire pour réduire l'accès au périphérique de stockage a tendance à être un bonus. Pour les lecteurs de disque, la réduction du nombre de recherches peut faire une grande différence, mais il existe un certain nombre d'influences que vous ne pouvez pas faire grand-chose, comme l'organisation des données sur les plateaux de disques, la vitesse de rotation des plateaux, la vitesse de déplacement des têtes, la mise en cache des des données, dans quelle mesure les occurrences de cache réduisent le déplacement vers le disque électromécanique, etc.
Richard Chambers
1

La cartographie est simplement le processus d'association d'une unité de données avec une autre unité de données. L'intention du mappage est de permettre un accès simplifié aux données mappées. Par exemple, dans les systèmes compatibles IBM classiques, l'adresse mémoire 0xB8000 a été mappée à la mémoire vidéo de la carte vidéo. L'écriture dans cette mémoire mettrait à jour le contenu de l'écran et la lecture de celui-ci récupérerait le contenu de l'écran. Le mappage de fichiers, le mappage de périphériques et même le mappage de structure de données (généralement appelé carte, HashMap ou dictionnaire) sont tous des moyens d'associer une unité de données à une autre unité de données.

La cartographie présente deux avantages principaux. Le premier est que le mappage réduit la complexité d'accès au périphérique ou au fichier associé. Par exemple, le mappage de fichiers et le mappage de périphériques vous permettent de traiter ces périphériques comme s'ils n'étaient que de la mémoire ordinaire. Au lieu d'apprendre différents ports d'E / S, commandes de données, etc., vous obtenez une interface simple qui est tout aussi naturelle et évidente que d'écrire sur la RAM.

Le deuxième avantage est qu'il peut réduire les besoins en mémoire. Par exemple, un Map<Integer, SomeDataType>peut produire un "tableau clairsemé", ce qui est utile lorsque vous voulez un tableau qui contiendra principalement des données invalides / inutilisées, et accessible en un temps quasi linéaire. Cela peut être beaucoup plus efficace qu'une liste chaînée (où il prend O ( n ) le temps d'accès à l' n -ième élément).

Le mappage est principalement utilisé comme abstraction pour cacher des algorithmes / fonctions complexes au développeur afin qu'ils puissent se concentrer sur la tâche de mise en œuvre du programme. Notez que le mappage peut ne pas toujours être aussi efficace, en termes de temps de traitement, que d'accéder directement à l'appareil ou au fichier, mais est toujours moins compliqué que de le faire (par exemple, le mappage réduit la quantité de code spécialisé que le développeur doit écrire pour accéder aux données ).

phyrfox
la source
Merci pour l'explication. Cependant, je ne comprenais pas ce que signifie "tableau clairsemé" et comment il est plus efficace.
Kais
@Kais Un tableau clairsemé est une liste composée principalement de valeurs nulles. Au lieu de stocker toutes les valeurs en mémoire, un tableau fragmenté stocke uniquement les valeurs non nulles en mémoire. Ce faisant, il est plus efficace que d'allouer simplement toute la mémoire à la fois. Les tableaux clairsemés doivent généralement être vides à environ 75% afin d'économiser de l'espace. La mémoire virtuelle fonctionne souvent de cette manière également, où le système d'exploitation ne stocke que les pages de mémoire "sales", ainsi que les systèmes de fichiers qui vous permettent de stocker uniquement des secteurs de valeurs non nulles.
phyrfox