Cosa significa "mappa"?


10

Ho incontrato il termine molte volte, in vari materiali didattici CS:

  1. L2 CS162 (UC Berkeley):

    I / O mappati in memoria

  2. L4 CS162 (UC Berkeley):

    File mappati in memoria

  3. L24 CS61 (UC Berkeley):

    "Memory I / O mappato": controllo dispositivo / registri dati associati allo spazio degli indirizzi della CPU

  4. Anche dopo aver cercato su Google "mapping", ho ottenuto l'articolo Map_ (funzione di ordine superiore) , ma per me non era molto chiaro.
  5. Ancora di più, ho cercato di capire il significato nel contesto di bitmapleggendo l'articolo di Wikipedia :

    Un array di bit è una mappatura da alcuni domini (quasi sempre un intervallo di numeri interi) ai valori nell'insieme {0, 1}

    Non ne sono sicuro, ma nel contesto sopra mi sembra la conversione dei dati.

  6. Più tardi, dopo aver letto un libro CS, ho trovato solo questo paragrafo, ma non ha spiegato il significato di "mappatura" per me:

    Mappatura della memoria Linux (insieme ad altre forme di Unix) inizializza il contenuto di un'area di memoria virtuale associandola a un oggetto su disco, un processo noto come mappatura della memoria.

  7. Ho anche ottenuto MapReduce come risultato della ricerca: dove la mappa è spiegata come "un linguaggio nel calcolo parallelo in cui una semplice operazione è applicata a tutti gli elementi di una sequenza, potenzialmente in parallelo".

Sono ancora confuso riguardo al termine. Qualcuno può spiegare cosa significa "mappa" nei contesti che ho citato?

Risposte:


14

Quindi, ci sono due usi distinti della parola "mappa", che disimballerò qui.

  1. fX2XX.f(X)=2X

    Questo utilizzo include "IO mappato in memoria:" esiste una funzione (concettuale) che associa ogni pezzo di memoria a una particolare azione IO. Nessuno in realtà scrive mai la funzione, ma è davvero lì: per ogni pezzo di memoria mappata, c'è qualche IO associato ad essa. Forse una parte di un disco, forse un registro hardware su una periferica, ecc.

    Allo stesso modo, gli array di bit (e gli array in generale) rientrano in questo: ogni indice ha un singolo elemento associato ad esso (in qualsiasi momento), quindi un array è effettivamente una codifica di una funzione di dominio finito.

  2. Nella programmazione funzionale e derivati ​​(come MapReduce), mappa si riferisce all'applicazione di una trasformazione attraverso una struttura.

    L'originale map proviene da Lisp, dove si riferiva alla funzione che ha assunto un'altra funzione e un elenco e ha restituito il risultato dell'applicazione della funzione a ciascun elemento di tale elenco.

    Ma questo fenomeno è abbastanza generale. In Haskell, una struttura di dati che ammette tale operazione è chiamata funtore , e l'operazione è chiamata FMAP (per ragioni storiche, per evitare conflitti con la mappa lista).

    Tutti questi sono collegati attraverso il concetto di Functor dalla teoria delle categorie, che è un'astrazione di strutture che ammettono un'operazione di "mappa".


4
(Errore di battitura nel Functornome del collegamento - troppo poco per suggerire una modifica.)
Mat

Spiegazione molto chiara ed eccellente. Tuttavia, non ho capito cosa significhi "funzione finita".
Kais

1
La "funzione finita" di @Kais è comunemente usata per una funzione per la quale nessun elemento è mappato su infinito. Immagino che jmite abbia voluto evidenziare che le matrici sono essenzialmente funzioni che mappano l'insieme di indici (validi) sui valori contenuti.
Michael Hoff,

2
I due usi sono in realtà solo aspetti della stessa cosa. La mapfunzione restituisce un risultato in cui ogni elemento è associato all'elemento corrispondente dell'input. La distinzione è che il primo uso descrive una relazione esistente, mentre il secondo si riferisce a un'operazione che crea la relazione.
Barmar,

1
Typo: Fucntor
Barmar

8

Di seguito sarò meno che preciso in vari modi, sacrificando l'accuratezza tecnica per fornire una comprensione di base. È ovvio che hai letto una serie di fonti tecniche e la stessa tecnicità del materiale ti sta rendendo difficile capire quale sia un concetto abbastanza semplice e di base.

In termini semplici, l'uso più comune della mappa delle parole è descrivere una relazione tra le cose in due insiemi diversi. Questa potrebbe essere una funzione matematica o potrebbe essere un altro tipo di rappresentazione e meccanismo. La più comune che viene subito in mente è la mappa stradale.

Una mappa stradale è un'immagine di un particolare terreno o area nel mondo reale in cui le linee, i disegni e le parole scritti sulla mappa corrispondono alle strade e agli edifici fisici reali. C'è una relazione uno a uno tra la rappresentazione del terreno che è raffigurata nella mappa stradale e il terreno reale.

Guardando oltre possiamo anche vedere che una mappa stradale è una rappresentazione del terreno reale. Il terreno reale ha oggetti e dettagli e processi dinamici che la mappa stradale non descrive. La mappa stradale è una rappresentazione astratta del terreno reale e ciò che è rappresentato nella mappa stradale è solo ciò che è necessario per adempiere al suo scopo, per fornire un aiuto di navigazione per il terreno reale.

Numerosi esempi nella domanda riguardano la creazione di una rappresentazione con meccanismi di supporto in modo che una persona possa utilizzare la rappresentazione e il meccanismo traduce le azioni della persona in ciò che è necessario per la funzionalità sottostante che è nascosta dalla facciata della rappresentazione.

L'I / O di file mappati in memoria consente a un programmatore di pensare a un file come una grande area di memoria, di utilizzare una rappresentazione di memoria di un file reale. Il programmatore non pensa al file come a un file ma invece lo considera come una grande area di memoria. La funzionalità di I / O del file mappato in memoria ha cura di assicurarsi che, quando il programmatore fa riferimento a un particolare offset della memoria, acceda ai dati corrispondenti nel file.

L'I / O del dispositivo mappato in memoria consente di semplificare un'interfaccia di programmazione del dispositivo scrivendo agli indirizzi di memoria o leggendo dagli indirizzi di memoria. Queste azioni di scrittura e lettura sono tradotte dalla funzionalità I / O del dispositivo mappato in memoria sottostante nelle azioni specifiche del dispositivo effettive necessarie per eseguire il servizio o l'azione richiesti.

Una mappa di bit è un insieme di bit che forniscono una corrispondenza uno a uno con i valori di un altro insieme. Ad esempio, la CreateFile()funzione dell'API Win32 ha diversi argomenti di bit map utilizzati per indicare diversi tipi di attributi di file. Bit specifici in una mappa di bit corrispondono a un comportamento specifico del file come "Apri in sola lettura" o "Crea sempre nuovo file vuoto". Vengono fornite costanti speciali che vengono combinate utilizzando operazioni di bit binarie per specificare gli argomenti effettivi. Vedere la funzione CreateFile e il codice sorgente di esempio in Apertura di un file per lettura o scrittura .


Ottima spiegazione Tuttavia per quanto riguarda il Memory mapped file I/O, è un'alternativa al file I / O standard (fopen, fgetc ..)? il vantaggio prestazionale è dovuto alla natura dell'accesso RAM più veloce rispetto ai dischi?
Kais

1
L'I / O di file con mappatura di memoria (MMF) di @Kais è un'alternativa all'utilizzo di chiamate API di file standard. L'utilizzo di MMF potrebbe comportare o meno un vantaggio in termini di prestazioni. Dipende davvero da quanto bene la meccanica di MMF si adatta al modo in cui stai usando il contenuto del file e da quanto è grande il file. Le pagine di I / O MMF salvano le aree del file in blocchi di grandi dimensioni. Puoi fare qualcosa di simile con l'API di file e fare una differenza significativa nelle prestazioni. Con l'I / O API di file standard tende ad essere molto copiato tra buffer di memoria dallo spazio del kernel allo spazio dell'utente che viene spesso bypassato con MMF.
Richard Chambers,

1
@Kais non sono sicuro di quello che stai chiedendo. La copia dei dati da una posizione di memoria a un'altra richiede tempo e cicli della CPU, quindi ridurre la copia dei dati migliora le prestazioni quando si accede ai dati. L'I / O del file è generico e internamente esegue la propria memorizzazione nella cache e il paging del contenuto del file, tuttavia in genere la dimensione dei buffer di memoria è inferiore a quella utilizzata con l'I / O del file mappato in memoria. L'API di file tende a essere orientata verso la promozione dell'I / O di blocchi piccoli piuttosto che blocchi di grandi dimensioni. L'accesso sequenziale tende a essere favorito con uno sguardo al futuro all'interno dello stack I / O e del kernel del file.
Richard Chambers,

1
@Kais, quindi se è possibile fornire un suggerimento all'API I / O dei file, è possibile migliorare le prestazioni dell'applicazione che utilizza l'API I / O dei file quando l'I / O dei file è un collo di bottiglia delle prestazioni. Inoltre, l'utilizzo di I / O di file mappati in memoria può essere utile soprattutto per l'accesso e le operazioni prevalentemente sequenziali che rientrano in una singola dimensione di pagina MMF. Vedi il materiale e i collegamenti a questo URL sull'I / O di basso livello con GNU C gnu.org/software/libc/manual/html_node/… che descrive alcuni dei meccanismi di livello inferiore GNU.
Richard Chambers,

1
@Kais Ho visto significativi miglioramenti delle prestazioni con l'API del file della libreria standard C utilizzando la setbuf()funzione per impostare un buffer I / O di file di grandi dimensioni. Tutto ciò che puoi fare per ridurre l'accesso al dispositivo di archiviazione tende ad essere un bonus. Per le unità disco che ridurre il numero di ricerche può fare una grande differenza, tuttavia ci sono una serie di influenze di cui non si può fare molto, come l'organizzazione dei dati sui piatti del disco, la velocità di rotazione dei piatti, la velocità di movimento della testa, la memorizzazione nella cache di dati, quanto bene i colpi di cache riducono l'accesso al disco elettromeccanico, ecc.
Richard Chambers

1

La mappatura è semplicemente il processo di associazione di un'unità di dati con un'altra unità di dati. Lo scopo della mappatura è consentire un accesso semplificato ai dati mappati. Ad esempio, nei sistemi classici compatibili IBM, l'indirizzo di memoria 0xB8000 è stato mappato sulla memoria video della scheda video. La scrittura su questa memoria aggiornerebbe il contenuto dello schermo e la lettura da essa recupererebbe il contenuto dello schermo. La mappatura dei file, la mappatura dei dispositivi e persino la mappatura della struttura dei dati (in genere denominata Mappa, HashMap o Dizionario) sono tutti modi per associare un'unità di dati a un'altra unità di dati.

La mappatura ha due vantaggi principali. Il primo è che la mappatura riduce la complessità dell'accesso al dispositivo o al file associato. Ad esempio, la mappatura dei file e la mappatura dei dispositivi consentono di trattare tali dispositivi come se fossero semplicemente memoria. Invece di apprendere varie porte I / O, comandi dati e così via, si ottiene un'interfaccia semplice che è altrettanto naturale ed ovvia come scrivere su RAM.

Il secondo vantaggio è che può ridurre i requisiti di memoria. Ad esempio, a Map<Integer, SomeDataType>può produrre un "array sparse", che è utile dove si desidera un array che conterrà principalmente dati non validi / non utilizzati e al quale è possibile accedere in un tempo quasi lineare. Questo può essere molto più efficiente di un elenco collegato (dove ci vuole O ( n ) tempo per accedere all'n -esimo elemento).

La mappatura viene utilizzata principalmente come astrazione per nascondere algoritmi / funzioni complicate allo sviluppatore in modo che possano concentrarsi sul compito di implementare il programma. Si noti che la mappatura potrebbe non essere sempre efficiente, in termini di tempo di elaborazione, come accedere direttamente al dispositivo o al file, ma è sempre meno complicata di così (ad esempio la mappatura riduce la quantità di codice specializzato che lo sviluppatore deve scrivere per accedere ai dati ).


Grazie per la spiegazione. Tuttavia non ho capito cosa significhi "matrice sparsa" e come sia più efficiente.
Kais

@Kais Un array sparse è un elenco che consiste principalmente di valori zero. Invece di memorizzare tutti i valori in memoria, un array sparse memorizza solo i valori diversi da zero in memoria. In questo modo, è più efficiente della semplice allocazione di tutta la memoria in una sola volta. Gli array sparsi in genere devono essere vuoti per circa il 75% per risparmiare spazio. La memoria virtuale funziona spesso anche in questo modo, dove il sistema operativo memorizza solo pagine di memoria "sporche", così come i file system che consentono di memorizzare solo settori con valori diversi da zero.
phyrfox il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.