Estoy tratando de averiguar si mmap
'ing un archivo, y luego usar madvise()
o posix_madvise()
con MADV_WILLNEED
/ POSIX_MADV_WILLNEED
en realidad activa E / S asíncrona de fondo para lectura anticipada. Las páginas del manual de madvise
no especifican si este es el caso; el comportamiento real de madvise
no queda claro en su mayoría, para permitir la flexibilidad de la implementación.
Pero, ¿alguna implementación de POSIX convencional real (como Linux) realmente realiza E/S de archivos asíncronos cuando se llama a madvise()
con MADV_WILLNEED
? Parece que no puedo obtener ninguna información confiable sobre esto. Esta pregunta sugiere que sí, al menos en Linux, incluso si no es ideal ya que no hay un mecanismo de devolución de llamada.
Este extracto del libro afirma que posix_fadvise
con POSIX_FADV_WILLNEED
hará lectura anticipada asíncrona, pero no menciona si madvise()
hace lectura anticipada asíncrona.
Además, parecería que todo el concepto de E/S de "lectura anticipada" realmente no tiene ningún sentido a menos que sea asíncrono. Si fue síncrono, simplemente hace que la aplicación del usuario se bloquee para la lectura anticipada, en lugar de más tarde cuando lee el archivo, lo que no parece una optimización particularmente poderosa.
Entonces, ¿ madvise()
con MADV_WILLNEED
realmente hace lectura anticipada asíncrona en cualquier plataforma principal (como Linux)?
Con Linux siempre puedes consultar el código fuente.
Ver fadvise.c :
case POSIX_FADV_WILLNEED: ... force_page_cache_readahead(mapping, f.file, start_index, nrpages); break;
Entonces, posix_fadvise
llama a force_page_cache_readahead
para realizar la lectura anticipada.
Ahora echemos un vistazo a madvise.c :
static long madvise_willneed(...) { ... force_page_cache_readahead(file->f_mapping, file, start, end-start); return 0; }
Entonces MADV_WILLNEED
y POSIX_FADV_WILLNEED
son equivalentes en Linux.
¿Puede esto llamarse E/S asíncrona? No me parece. Async IO generalmente implica que hay alguna notificación que le permite recuperar datos. El consejo es solo un consejo: no solo no sabe cuándo los datos están listos para ser leídos, sino que si es demasiado tarde, es posible que los datos ya se desechen.
En general, debe suponer que las funciones m* no realizarán una lectura anticipada asíncrona.