Capire MMAP


10

Stavo esaminando la documentazione relativa a MMAP qui e ho provato a implementarlo usando questo

Ho qualche dubbio sulla sua attuazione.

  1. MMAP fornisce una mappatura di un file e restituisce un puntatore di quella posizione nella memoria fisica o restituisce un indirizzo della tabella di mappatura? e alloca e blocca lo spazio anche per quel file?

  2. Una volta che il file è archiviato in quella posizione in memoria, rimane lì fino a quando non viene chiamato Munmap?

  3. Il file viene persino spostato in memoria o è solo una tabella di mapping che funge da reindirizzamento e il file si trova effettivamente nella memoria virtuale (disco)?

  4. Supponendo che venga spostato in memoria, altri processi possono accedere a quello spazio per leggere i dati se hanno un indirizzo?


2
Non implementare mmap , ma che si sta utilizzando è
Basile Starynkevitch

Risposte:


13

Rispondere alle cose in ordine:

  1. Restituisce un puntatore alla posizione nella memoria virtuale e lo spazio degli indirizzi della memoria virtuale è allocato, ma il file non è bloccato in alcun modo a meno che non lo si blocchi esplicitamente (si noti inoltre che bloccare la memoria non è lo stesso che bloccare l'area nella file). Un'implementazione efficiente di mmap () è effettivamente possibile solo da una prospettiva pratica a causa del paging e della memoria virtuale (altrimenti, richiederebbe la lettura dell'intera regione in memoria prima che la chiamata venga completata).
  2. Non esattamente, questo si lega alla risposta successiva, quindi la tratterò lì.
  3. Tipo. Ciò che sta realmente accadendo nella maggior parte dei casi è che mmap () sta fornendo l'accesso copia-scrittura ai dati di quel file nella cache della pagina. Di conseguenza, si applicano le consuete restrizioni della cache sulla durata dei dati (se il sistema ha bisogno di spazio, le pagine possono essere eliminate (o scaricate sul disco se sono sporche) dalla cache e devono essere nuovamente inserite in errore.
  4. No, a causa del funzionamento della memoria virtuale. Ogni processo ha il suo spazio di indirizzi virtuale, con i suoi mapping virtuali. Ogni programma che vuole comunicare dati dovrà chiamare mmap () sullo stesso file (o segmento di memoria condivisa) e tutti dovranno usare il MAP_SHAREDflag.

Vale la pena notare che mmap () non funziona solo sui file, ma puoi anche fare altre cose come:

  • Mappatura diretta della memoria del dispositivo (se si dispone di privilegi sufficienti). Questo è effettivamente utilizzato su molti sistemi embedded per evitare la necessità di scrivere driver in modalità kernel per il nuovo hardware.
  • Mappa segmenti di memoria condivisa.
  • Mappare esplicitamente pagine enormi.
  • Alloca memoria che puoi quindi chiamare madvise (2) su (che a sua volta ti consente di fare cose utili come impedire che i dati vengano copiati su un processo figlio su fork (2) o contrassegnare i dati per KSM (funzionalità di deduplicazione della memoria di Linux)).

Grazie per una risposta così dettagliata. Solo un chiarimento sul punto 1. Se provo ad accedere all'indirizzo di memoria virtuale restituito. Passerà prima attraverso la mappa degli indirizzi creata per il processo e quindi reindirizzata alla posizione effettiva, che può essere disco, cache o memoria In secondo luogo se il flag MAP_SHARED è attivo e la tabella per entrambi i processi restituisce lo stesso valore per l'indirizzo fisico, quindi il il file può essere condiviso?
Giovanni,

1. Sì, utilizzerà la tabella di mappatura della memoria virtuale. 2. L'indirizzo in ogni processo non ha importanza, solo il fatto che abbiano mappato la stessa regione dello stesso file con MAP_SHARED.
Austin Hemmelgarn,
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.