Domanda

Quando si mappa un file nella memoria, è necessario una chiamata di sistema. Fare gli accessi successivi al file richiedono chiamate di sistema o è la pagina di memoria virtuale del processo mappato la cache della pagina effettiva in memoria?

Aggiorna : quello che voglio anche sapere è che se più processi accedono lo stesso file attraverso mmap. saranno accedendo alla stessa porzione di memoria fisica scrittura.

È stato utile?

Soluzione

Non è necessario per le chiamate di sistema supplementari (dal processo) , basta accedervi come la memoria normale. Quando hai finito con il file, basta chiamare munmap.

  

Valore di ritorno

     

In caso di successo, mmap()   restituisce un puntatore alla zona mappata.   In caso di errore, il valore MAP_FAILED (che   è, (void *) -1) viene restituito, e   errno viene impostato di conseguenza. Sopra   successo, munmap() restituisce 0, il   fallimento -1, e errno è impostato (probabilmente   a EINVAL).

vedere la pagina man qui per i dettagli .

Modifica Per chiarezza:

sto dicendo che la funzione associa il file nello spazio di memoria del processo chiamante e restituisce un puntatore all'inizio del blocco di memoria.

Ad esempio, se si hanno due diversi processi mappa lo stesso file con il flag MAP_SHARED allora ogni processo sarà l'accesso alla stessa memoria fisica, ma che la memoria può essere mappata in una posizione diversa nello spazio di memoria virtuale di ogni processo, vale a dire la puntatori restituiti da mmap nello spazio di memoria virtuale di ogni processo non può essere uguale.

Questo porta al punto che se per esempio bisogno di memorizzare i puntatori all'interno del blocco di memoria condivisa quei puntatori solo sarebbe utile se fossero memorizzati come offset rispetto all'inizio del file / blocco e sarebbero solo in grado di utilmente puntare a posizioni interne al / file di blocco.

Altri suggerimenti

Quando si mmap un file, Linux crea voci nel (unità di gestione della memoria) MMU. La MMU veglia su tutti letture e scritture della CPU al reale RAM. In questo modo, si sa quando si accede parti della memoria che mmap() restituito. Leggendo le parti che non sono ancora nel vero RAM causerà errori di pagina. La MMU li cattura e chiamare una routine kernel per caricare la parte destra del file nella RAM da qualche parte e allora sarà aggiornare la voce nella tabella MMU così sembra che il dato si trova ora presso l'indirizzo che mmap() ti ha dato. In realtà, sarà da qualche altra parte, ma la MMU renderà questa completamente trasparente.

Quando si scrive nella memoria, la MMU segnerà le pagine modificate come "sporco". Quando sono risciacquati (perché si accede più del file o perché si chiama munmap()), quindi le modifiche verranno scritti su disco.

Così, ogni volta che un errore di pagina e una pagina di colore sporco accade, una chiamata di sistema che accade. Ma dal momento che le pagine sono 4 o 8 KB, questi accadere raramente. Inoltre, il kernel caricare più di una singola pagina alla volta, quindi il numero delle chiamate di sistema è ridotto di nuovo. Infine, lo stesso codice viene utilizzato per implementare lo scambio, quindi è molto ottimizzato.

Tutti questi effetti rendono mmap così efficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top