GNU/Linux >> Linux Esercitazione >  >> Linux

Perché le regioni mappate in memoria di sola lettura hanno pagine sporche?

Una pagina sporca non richiede necessariamente una riscrittura. Una pagina sporca è quella su cui è stata scritta dall'ultima volta che il kernel l'ha contrassegnata come pulita. Non è sempre necessario salvare i dati nel file originale.

Le pagine sono private, non condivise, quindi non verrebbero salvate nuovamente nel file originale. Sarebbe impossibile avere una pagina sporca supportata da un file di sola lettura. Se la pagina deve essere rimossa dalla RAM, verrà salvata in swap.

Le pagine di sola lettura, private e sporche, ma all'interno dell'intervallo di un file mappato in memoria, sono in genere pagine di dati che contengono costanti che devono essere inizializzate in fase di esecuzione, ma non cambiano dopo che sono state inizializzate. Ad esempio, possono contenere dati statici che incorporano puntatori; i valori del puntatore dipendono dall'indirizzo a cui è mappato il programma o la libreria, quindi deve essere calcolato dopo l'avvio del programma, con la pagina in lettura-scrittura in questa fase. Dopo che i puntatori sono stati calcolati, il contenuto della pagina non cambierà mai in questa istanza del programma, quindi la pagina può essere modificata in sola lettura. Vedi "Hunting Down Dirty Memory Pages" di stosb per un esempio con frammenti di codice.

Potresti, più raramente, vedere pagine di sola lettura, eseguibili, private, sporche; questi si verificano con alcuni linker che mescolano codice e dati più liberamente o con la compilazione just-in-time.


Oltre ai casi che Gilles elenca:

Quando un processo esegue il fork, il kernel può contrassegnare tutte le sue pagine sporche come di sola lettura e saranno condivise tra genitore e figlio. Quando uno dei processi scrive sulla pagina, si verificherà un'eccezione e il kernel copierà la pagina e la contrassegnerà come scrivibile. Ciò consente di risparmiare il lavoro di copia delle pagine che alla fine non vengono modificate nuovamente da nessuno dei due processi. (Notare che in questa situazione, le pagine sono contrassegnate come di sola lettura nell'hardware ma sono note al kernel come scrivibili.)


Linux
  1. Perché Windows10 VM è lento su OpenStack?

  2. Perché usare shm_open?

  3. Invio TCP in spazio utente a copia zero della memoria mappata dma_mmap_coherent()

  4. Perché il mio sistema mostra solo 3,2 GiB di RAM quando ho sicuramente 4,0 GiB

  5. Perché pvremove ha una forza duplicata nella pagina man?

Personaggi delle citazioni della pagina man?

Perché '/' ha una voce '..'?

6 motivi per cui Linux non ha più app

Perché la mappatura MAP_GROWSDOWN non cresce?

Perché abbiamo 3 tipi di selezioni X in LINUX?

Perché la memoria condivisa del kernel è 0 su Ubuntu 12.04?