2010-01-25 7 views
15

Esiste un equivalente di Windows al readahead di syscall di Linux?Windows equivalente al readahead di Linux syscall?

EDIT:

Vorrei una firma funzione completa se possibile, che mostra i parametri/conteggio di offset (equivalente o inferiore/superiore).

Esempio: La firma funzione di Linux è:

ssize_t readahead(int fd, off64_t *offset, size_t count); 

e un esempio del suo utilizzo è

readahead(file, 100, 500); 

Dove "file" è un descrittore di file precedentemente impostata da una funzione come mmap. Questa chiamata è la lettura a 500 byte indice 100.

EDIT 2: Si prega di leggere questo se non siete sicuri che cosa readahead fa: http://linux.die.net/man/2/readahead

risposta

11

Sì. È FileSystemControl FSCTL_FILE_PREFETCH.

Viene utilizzato in Windows Vista e sopra per il prefetching sia all'avvio dell'applicazione che al momento dell'avvio.

Viene anche utilizzato dalla tecnologia SuperFetch che utilizza l'euristica per caricare le applicazioni a circa le ore del giorno in cui vengono generalmente utilizzate.

FSCTL_FILE_PREFETCH sé non è documentato su MSDN, ma è facile capire il formato dei parametri esaminando le chiamate effettuate DeviceIoControl all'avvio app: Basta avviare un'applicazione nel debugger che ha già un file nella directory .pf c:\Windows\Prefetch e interrompere su DeviceIoControl (o se si sta utilizzando un debugger del kernel, interrompere quando il driver NTFS riceve il primo FSCTL_FILE_PREFETCH). Esaminare il buffer passato e confrontarlo con il file .pf e l'intervallo effettivamente utilizzato in seguito. L'ho fatto una volta per curiosità ma non ho registrato i dettagli.

Nel caso in cui non si ha dimestichezza con DeviceIoControl e IRP_MJ_FILESYSTEM_CONTROL, ecco alcuni link da guardare:

+0

È una buona risposta, ma sono un po 'confuso. Il syscall di Linux ha la firma: readahead (int fd, off64_t * offset, size_t count); es .: readahead (file, 100, 500); Che presumo leggerà 500 byte all'offset 100 del file con il file descrittore "file". Quale sarebbe qualcosa di equivalente in Windows? – joemoe

+7

Hai un link per dove sono documentati, o una dimostrazione di come vengono utilizzati? In questo momento non ho idea di come interpretare questa risposta. –

+1

Ancora non ne sono sicuro. Quello che sto cercando è una firma di funzione e un esempio che dimostra il suo uso. Vedi la mia domanda modificata per un esempio. – joemoe

0

Non sono sicuro di aver compreso corr ectly, in cosa hai detto 'Dove "file" è un descrittore di file precedentemente impostato da una funzione come mmap. Questa chiamata sta leggendo 500 byte nell'indice 100. 'Sembra sospettosamente come cercare l'offset e leggere 500 byte ... ma si desidera che sia precompilato in anticipo ...

In codice C, sarebbe simile a questa:

 
fseek(fp, 100, SEEK_CUR); 
fread(&data, 500, 1, fp); 

Ma prefetching, immagino, si vorrebbe collegare un qualche tipo di eventi utilizzando waithandles, e quando l'evento viene sollevato, i dati vengono memorizzati da qualche parte in un buffer ...

Per essere onesti, non ho mai visto una cosa simile a pre-raccolta dei dati ... ma la risposta di Ray mi ha sorpreso, ma poi è solo per Vista verso l'alto, se si desidera mantenere la compatibilità ... questo è qualcosa da tenere a mente ... ma i link qui di seguito possono essere di aiuto ...

Ok, c'era un blog discutere di questo, una libreria scritta in Delphi, il codice sorgente è here, la navigazione il codice here, ok, potrebbe non essere quello che vuoi ma potrebbe aiutarti a orientarti nella direzione ... Scusa se non è quello che stai cercando ...

Spero che questo aiuti, Cordiali saluti, Tom.

+0

No, questo non è quello che sto cercando. Sto cercando una funzione che sia funzionalmente equivalente a "readahead" in Linux. – joemoe

0

A partire da Windows 8, esiste un equivalente più o meno diretto a madvise(MADV_WILLNEED), che è effettivamente la stessa cosa (Windows ha un sistema VM/cache unificato).

Supponendo di aver mappato in memoria il file, è possibile utilizzare PrefetchVirtualMemory per precaricarlo.

Questo è ancora leggermente più complicato di quanto si possa desiderare, ma non altrettanto duro come DeviceIoControl. Si noti inoltre che è possibile precaricare facilmente diversi intervalli indipendenti e discontinui.

Problemi correlati