Domanda

I sistemi operativi letti dal disco più di quello che un programma richiede in realtà, perché un programma rischia di necessità vicina informazioni in futuro. Nella mia applicazione, quando vado a prendere un oggetto dal disco, vorrei mostrare un intervallo di informazioni attorno all'elemento. C'è un trade off tra la quantità di informazioni chiedo e spettacolo, e la velocità. Tuttavia, dal momento che il sistema operativo si legge già più di quello che ho chiesto, l'accesso a questi byte già in memoria è gratuito. Cosa API posso usare per scoprire cosa c'è nella cache OS?

In alternativa, ho potuto usare i file mappati memoria. In questo caso, il problema si riduce a scoprire se una pagina viene scambiato su disco oppure no. questo può essere fatto in qualsiasi sistema operativo comune?

EDIT: Related carta http://www.azulsystems.com/events/mspc_2008 /2008_MSPC.pdf

È stato utile?

Soluzione

È possibile infatti utilizzare il secondo metodo, almeno su Linux. mmap() il file, quindi utilizzare la funzione mincore() per determinare quali pagine sono residenti. Dalla pagina man:

  

int mincore(void *addr, size_t length, unsigned char *vec);

     

mincore() restituisce un vettore che   Indica se le pagine del chiamante   memoria virtuale del processo sono residenti   nel nucleo (RAM), e quindi non causerà un   l'accesso al disco (errore di pagina) se   riferimento. I rendimenti del kernel   informazioni sulla residenza   le pagine che iniziano all'indirizzo addr,   e proseguendo per byte length.

C'è, naturalmente, una condizione di gara qui - mincore() posso dire che una pagina è residente, ma potrebbe poi essere sostituita appena prima di accedervi. C'est la vie .

Altri suggerimenti

stai partendo da una presunzione sbagliata. Almeno su Linux, il sistema operativo cercherà di capire modelli di accesso del programma. Se andate a leggere un file in modo sequenziale, il kernel precaricare in sequenza. Se si salta tutto il file di molto, il kernel sarà probabilmente confuso in un primo momento, ma poi si fermerà prefetching.

Quindi, se davvero sono accesso al tuo file in sequenza, si sa che cosa è probabilmente eseguito il prefetching: il blocco di dati successivo. Se siete alla ricerca in modo casuale, probabilmente niente altro nelle vicinanze è eseguito il prefetching.

Prova a avvicinarsi a questo un modo diverso. Prima di chiamare read () per ottenere le informazioni che necessità , chiamata fadvise () di lasciare che il sistema operativo sapere cosa ne volete per avviare loading ..

Sono anche curioso di sapere che tipo di applicazione che si sta utilizzando che può funzionare correttamente soltanto operando su dati che sembra essere nella cache del file per caso. Mi sento come siamo riusciti a trovare un buon modo per affrontare il vostro bisogno, se hai postato un po 'più di informazioni.

E 'di certo non può essere fatto su Windows. Su Windows il comportamento avanti lettura è fino al sistema operativo, e anche se si potrebbe dire quanto aveva letto in anticipo, non farebbe alcun bene perché non appena ci si scoperto, l'in pagine di memoria che sono utilizzata per il caching avrebbe potuto essere recuperato per altri impieghi.

La stessa cosa vale per determinare se una pagina è residente o meno. Non appena avete trovato la risposta potrebbe cambiare quando qualche altro thread ha bisogno di memoria per qualcos'altro.

Se si voleva davvero fare assottiglia genere di cose su Windows è possibile disattivare il buffering e gestire i buffer da soli. Questo è il percorso IO più veloce, ma è anche il più complesso -. Bisogna essere molto attenti, e spesso il sistema operativo può ancora fare meglio

  

Quali API può utilizzare per scoprire cosa c'è nella cache OS?

Non è certamente un modo standard di fare questo per qualsiasi sistema POSIX, e non ho conoscenza di alcun modo specifico non standard per Linux. L'unica cosa che si può sapere (quasi) per certo è che il file system avrà letto in un multiplo della dimensione della pagina, di solito 4kB. Quindi, se la vostra legge sono piccole, è possibile conoscere con elevata probabilità (anche se non di sicuro) che i dati nella pagina circostante è in memoria.

Si potrebbe, suppongo, fare le cose furbata come tempistica per quanto tempo c'è voluto un sistema di lettura al completo. Se è veloce, che è 100s di microsecondi o meno, è stato probabilmente un colpo di cache. Una volta che si arriva fino a un millisecondo o giù di lì, probabilmente era una cache miss. Naturalmente, questo non effettivamente aiutare molto, ed è molto molto fragile.

Si noti che una volta che il file system ha copiato i dati di buffer utente, è libero di eliminare immediatamente i buffer contenenti i dati dal disco. Probabilmente non lo fa subito, ma non si può dire con certezza.

Infine, secondo @ suggerimento di Karmastan: spiegare il fine più ampio che si sta cercando di raggiungere. C'è probabilmente un modo per farlo, ma quello che hai suggerito non è vero.

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