Domanda

O sarebbe più veloce di ri-leggere i dati da mappare la memoria, ancora una volta, dal momento che il sistema operativo possa eseguire il proprio cache?

La natura dei dati non è noto in anticipo, si presume che il file si legge sono casuali.

È stato utile?

Soluzione

ho voluto parlare di un paio di cose che ho letto sull'argomento. La risposta è non , non si vuole indovinare secondo gestore della memoria del sistema operativo.

Il primo viene da l'idea che si desidera che il programma di (ad esempio MongoDB, SQL Server) per cercare di limitare la memoria sulla base di una percentuale di RAM libera:

  

Non cercare di allocare memoria finché non ci sarà solo x% libera

     

Di tanto in tanto, un cliente chiederà un modo di progettare il loro programma così continua consumare RAM fino a quando v'è solo x% libero. L'idea è che il loro programma dovrebbe usare la RAM in modo aggressivo, pur lasciando abbastanza RAM disponibile (x%) per altri usi. A meno che non si sta progettando un sistema in cui si è l'unico programma in esecuzione sul computer, questa è una cattiva idea.

     

(leggi l'articolo per la spiegazione di perché è male, comprese le immagini)

Dopo viene da alcune note da parte dell'autore di vernice, e di proxy inverso:

  

Varnish Cache - Note dall'architetto

     

Che cosa succede con calamari gestione della memoria elaborata è che si arriva a botte con il kernel gestione della memoria elaborata, e come ogni guerra civile, che non viene mai fatto nulla.

     

Quello che succede è questo: Squid crea un oggetto HTTP in "RAM" e si abitua a volte rapidamente dopo la creazione. Poi, dopo qualche tempo non si riceve più visite e il kernel accorge. Poi qualcuno cerca di ottenere memoria dal kernel per qualcosa e il kernel decide di spingere quelle pagine inutilizzate della memoria verso lo spazio di swap e utilizzare il (cache-RAM) più sensibilmente per alcuni dei dati che viene effettivamente utilizzato da un programma. Questo, tuttavia, viene fatto senza calamari lo sappia. Squid pensa ancora che questi oggetti HTTP sono in RAM, e saranno, molto in secondo luogo si cerca di accedervi, ma fino ad allora, la RAM è usato per qualcosa di produttivo.

Immaginate di fare di cache qualcosa da un file mappato in memoria. Ad un certo punto nel futuro che la memoria sostenendo che "cache" sarà scambiato sul disco.

  • il sistema operativo ha scritto al qualcosa di hard-drive che esiste già sul disco rigido

Segue un momento in cui si desidera eseguire una ricerca dalla memoria "cache", piuttosto che la memoria "reale". Si tenta di accedere alla "cache", e dal momento che è stato scambiato fuori RAM dell'hardware solleva una PAGE FAULT, e la cache viene scambiato di nuovo in RAM.

  • la memoria cache è lento come la memoria "reale", dal momento che entrambi non sono più in RAM sono

Infine, si vuole liberare la cache (forse il programma è in fase di arresto). Se la "cache" è stato scambiato, il sistema operativo deve prima scambiare indietro in modo che possa essere liberato. Se invece avete appena mappata file memory-mapped, tutto è andato (non ha bisogno di essere scambiati in).

  • in questo caso la cache rende le cose più lente

Anche in questo caso da Raymon Chen: Se l'applicazione sta chiudendo - vicino già:

  

Quando DLL_PROCESS_DETACH si dice che il processo sta uscendo, La cosa migliore è solo per tornare senza fare nulla

     

Io uso regolarmente un programma che non segue questa regola. Il programma   alloca molta memoria durante il corso della sua vita, e quando ho   uscire dal programma, ma appena ci si siede per diversi minuti, a volte   filatura al 100% CPU, spesso sfornare il disco rigido (talvolta   entrambi). Quando ho schiacciato con il debugger per vedere cosa sta succedendo, mi   scoprire che il programma non sta facendo niente produttivo. È appena   metodicamente liberando ogni ultimo byte di memory era allocato durante   la sua durata.

     

Se il mio computer non era sotto una forte pressione di memoria, quindi la maggior parte del   la memoria il programma aveva assegnato durante la sua vita non è stata ancora   paging, in modo da liberare fino all'ultima goccia di memoria è una CPU-bound   operazione. D'altra parte, se avessi preso il via una generazione o fatto   qualcos'altro intensivo della memoria, allora la maggior parte della memoria del programma   aveva assegnato durante la sua vita è stata paging, il che significa che   la pagine di programma tutto ciò che la memoria indietro nel dal disco rigido, solo così   si potrebbe chiamare gratuitamente su di esso. Suona un po 'dispettoso, in realtà. "Venire   qui così posso dirvi di andare via ".

     

Tutto questo la gestione della memoria anal-rententive è inutile. Il processo   è uscire. Tutto ciò che la memoria verrà liberata quando lo spazio indirizzo è   distrutto. Smettere di sprecare tempo e solo uscire già.


La realtà è che i programmi non funzionano più in "RAM" , che corrono in di memoria - < em> virtual di memoria.

possono fare uso di una cache, ma si deve lavorare con virtual gestore della memoria del sistema operativo:

  • si desidera mantenere la cache entro il minor numero di pagine possibile
  • si vuole garantire che rimangono nella RAM, per la virtù di loro a cui si accede molto (vale a dire in realtà essere una cache utile)

Accesso:

  • un migliaio di posizioni 1 byte intorno ad un file di 400 GB

è molto più costoso di accesso

  • un unico luogo di 1000 byte in un file di 400 GB

In altre parole:. Non si ha realmente bisogno di di cache di dati, è necessario un più localizzato struttura dati

Se si mantiene i dati importanti confinati a una singola pagina 4k, si giocherà molto più bello con la VMM; Finestre è la cache.

Quando si aggiungono 64 byte quad-word allineato cache-linee, c'è ancora di più incentivo ad adeguare il layout struttura di dati. Ma poi non si vuole che anche compatti, o si inizia la sofferenza sanzioni prestazioni di vampate di cache da false Condivisione .

Altri suggerimenti

La risposta è altamente specifico per OS. In generale, non ci sarà alcun senso in cache questi dati. Entrambi i dati "cache", così come il memory-mapped possono essere paging via in qualsiasi momento.

Se non ci sarà alcuna differenza sarà specifico per un sistema operativo -. A meno che non è necessario che la granularità, non v'è alcun senso in cache i dati

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