2010-01-25 11 views
15

¿Hay un equivalente de Windows al syscall readahead de Linux?Windows equivalente a la llamada de readahead de Linux?

EDIT:

Me gustaría una firma de función completa, si es posible, que muestra los parámetros/recuento de terminación equivalente (o inferior/superior).

Ej: La firma de la función Linux es:

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

y un ejemplo de su uso es

readahead(file, 100, 500); 

Donde "archivo" es un descriptor de archivo establecido previamente por una función como mmap. Esta llamada es la lectura de 500 bytes en el índice 100.

EDIT 2: favor, lea esto si no está seguro de lo que hace readahead: http://linux.die.net/man/2/readahead

Respuesta

11

Sí. Es FileSystemControl FSCTL_FILE_PREFETCH.

Se usa en Windows Vista y en versiones anteriores para la recuperación previa tanto cuando se inicia una aplicación como durante el arranque.

También es utilizado por la tecnología SuperFetch que usa heurística para cargar aplicaciones aproximadamente a la hora del día en que generalmente las usa.

FSCTL_FILE_PREFETCH sí no está documentado en MSDN, pero es fácil de entender el formato de parámetro mediante el examen de los DeviceIoControl las llamadas realizadas en el arranque de aplicaciones: Sólo iniciar una aplicación en el depurador que ya tiene un archivo en el directorio .pf c:\Windows\Prefetch y romper en DeviceIoControl (o si está utilizando un depurador de núcleo, se rompe cuando el controlador NTFS recibe su primer FSCTL_FILE_PREFETCH). Examine el búfer pasado y compárelo con el archivo .pf y el rango que se usa más adelante. Lo hice una vez por curiosidad, pero no registré los detalles.

En caso de que usted no está familiarizado con DeviceIoControl y IRP_MJ_FILESYSTEM_CONTROL, aquí hay algunos enlaces para mirar:

+0

Es una buena respuesta, pero estoy un poco confundido. El syscall de Linux tiene la firma: readahead (int fd, off64_t * offset, size_t count); por ejemplo: readahead (archivo, 100, 500); Supongo que leerá 500 bytes en el offset 100 del archivo con el "archivo" de descriptor de archivo. ¿Qué sería algo equivalente en Windows? – joemoe

+7

¿Tienes un enlace para saber dónde están documentados o una demostración de cómo se usan? En este momento no tengo idea de cómo interpretar esta respuesta. –

+1

Todavía no estoy seguro de entender. Lo que estoy buscando es una firma de función y un ejemplo que demuestre su uso. Ver mi pregunta editada para un ejemplo. – joemoe

0

No estoy seguro de si entiendo corr ectly, en lo que dijiste 'Donde "file" es un descriptor de archivo previamente configurado por una función como mmap. Esta llamada está leyendo 500 bytes en el índice 100. 'Eso suena sospechosamente como buscar el desplazamiento y leer 500 bytes ... pero quiere que se lo busque de antemano ...

En el código C, lo haría algo parecido a esto:

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

Pero la obtención previa, supongo, que se quiere conectar algún tipo de eventos utilizando waithandles, y cuando el evento se levantó, los datos se almacenan en algún lugar de un amortiguador ...

Para ser sincero, no he encontrado una cosa tal que haga una búsqueda previa de datos ... pero la respuesta de Ray me sorprendió, pero de nuevo solo es para Vista hacia arriba, si quiere mantener la compatibilidad ... eso es algo a tener en cuenta ... pero los enlaces a continuación pueden ser de ayuda ...

Ok, hubo una discusión de este blog, una biblioteca escrita en Delphi, el código fuente es here, navegar por el código here, bien, puede que no sea lo que quieres pero puede ayudarte a apuntar en la dirección ... Lo siento si no es lo que estás buscando ...

Hope this helps, Un saludo, Tom.

+0

No, esto no es lo que estoy buscando. Estoy buscando una función que sea funcionalmente equivalente a "readahead" en Linux. – joemoe

0

A partir de Windows 8, existe un equivalente más o menos directo de madvise(MADV_WILLNEED), que efectivamente es lo mismo (Windows tiene un sistema unificado de máquina virtual/caché).

Suponiendo que ha mapeado la memoria del archivo, puede usar PrefetchVirtualMemory para captarlo previamente.

Esto es un poco más complicado de lo que desearía, pero no es tan difícil como DeviceIoControl. También tenga en cuenta que puede captar previamente varios rangos discontinuos e independientes.

Cuestiones relacionadas