Subire un VM fault non è costoso se la pagina sottostante
è già nella memoria fisica e deve solo essere mappata di
nuovo nel processo, ma può divenire costoso nel caso se ne
subiscano un bel po' su base regolare. Un buon esempio di ciò si
ha eseguendo un programma come ls(1) o ps(1) ripetutamente.
Se il binario del programma è mappato in memoria ma non nella
tabella delle pagine, allora tutte le pagine che verranno accedute dal
programmma dovranno generare un page fault ogni volta che il programma
viene eseguito.
Ciò non è necessario quando le pagine in questione sono
già nella cache della VM, quindi FreeBSD tenterà di
pre-popolare le tabelle delle pagine di un processo con quelle pagine che
sono già nella VM Cache. Una cosa che FreeBSD non fa ancora
è effettuare il pre-copy-on-write di alcune pagine nel caso di una
chiamata a exec.
Ad esempio, se esegui il programma ls(1) mentre stai eseguendo
vmstat 1
noterai che subisce sempre un certo numero
di page fault, anche eseguendolo ancora e ancora. Questi sono
zero-fill fault, legati alla necessità di azzerare memoria,
non program code fault, legati alla copia dell'eseguibile in memoria
(che erano già stati gestiti come pre-fault).
Pre-copiare le pagine all'exec o alla fork è un'area che potrebbe
essere soggetta a maggior studio.
Una larga percentuale dei page fault che accadono è composta di
zero-fill fault. In genere è possibile notare questo fatto
osservando l'output di vmstat -s
.
Questi accadono quando un processo accede a pagine nell'area del BSS.
Ci si aspetta che l'area del BSS sia composta inizialmente da zeri
ma il sistema della VM non si preoccupa di allocare nessuna memoria
finché il processo non ne ha effettivamente bisogno.
Quindi nel momento in cui accade un fault il sistema della VM non
deve solo allocare una nuova pagina, ma deve anche azzerarla.
Per ottimizzare l'operazione di azzeramento, il sistema della VM
ha la capacità di pre-azzerare le pagine e segnalarle come tali,
e di richiedere pagine pre-azzerate quando avvengono zero-fill fault.
Il pre-azzeramento avviene quando la CPU è inutilizzata ma il
numero di pagine che vengono pre-azzerate dal sistema è limitato
per evitare di spazzare via la cache della memoria. Questo è un
eccellente esempio di complessità aggiunta al sistema della VM per
ottimizare il percorso critico.
Questo, ed altri documenti, possono essere scaricati da ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Per domande su FreeBSD, leggi la
documentazione prima di contattare
<questions@FreeBSD.org>.
Per domande su questa documentazione, invia una e-mail a
<doc@FreeBSD.org>.