Lección 19: I/O mapeado en memoria vs I/O almacenado en búfer
Al cargar datasets de varios gigabytes para entrenamiento en GPU, cada milisegundo de I/O importa. Hay tres enfoques principales: I/O almacenado en búfer (stdio), mmap, que mapea un archivo directamente en la memoria virtual, y sendfile para redes zero-copy. En NVIDIA, al cargar los pesos del modelo
buffered read es como sacar libros de la biblioteca y fotocopiarlos antes de usarlos. mmap es como sentarte directamente en la biblioteca — sin copiar, leyendo del original. sendfile es como enviar un libro de la biblioteca directamente a un amigo sin que tú lo toques nunca.
- I/O almacenado en búfer
- I/O a través de stdio (fread, fwrite) que acumula datos en un buffer de user space antes de transferirlos al kernel. Reduce las llamadas al sistema pero agrega una copia adicional de datos.
- I/O directo
- I/O que evita el page cache del kernel. Se activa con O_DIRECT. Requiere alinear el buffer a 512 bytes. Útil cuando la aplicación gestiona su propio caché.
- zero-copy
- Técnica de I/O que transfiere datos directamente entre buffers del kernel sin copiarlos a user space. sendfile() y mmap son dos implementaciones comunes.
- sendfile
- Llamada al sistema que transfiere datos de un FD de archivo a un FD de socket directamente dentro del kernel — sin copiar a user space. Se usa en Nginx y servidores web para servir archivos estáticos.
- page cache
- Un buffer en la RAM del kernel que almacena el contenido de archivos accedidos recientemente. Las lecturas repetidas del mismo archivo se sirven desde la RAM en lugar del disco.