Leçon 19 : I/O mappée en mémoire vs Buffered I/O
Quand tu charges des datasets de plusieurs gigaoctets pour l'entraînement sur GPU, chaque milliseconde d'I/O compte. Il existe trois approches principales : le buffered I/O (stdio), mmap qui mappe un fichier directement dans la mémoire virtuelle, et sendfile pour un réseau zero-copy. Chez NVIDIA, po
Le buffered read, c'est comme emprunter des livres à la bibliothèque et les photocopier avant de les utiliser. mmap, c'est comme s'installer directement à la bibliothèque — pas de copie, tu lis l'original. sendfile, c'est comme envoyer un livre de la bibliothèque directement à un ami sans jamais le toucher toi-même.
- buffered I/O
- I/O via stdio (fread, fwrite) qui accumule les données dans un buffer en user space avant le transfert vers le noyau. Réduit le nombre de system calls mais ajoute une copie de données supplémentaire.
- direct I/O
- I/O qui contourne le page cache du noyau. Activé avec O_DIRECT. Nécessite un alignement du buffer sur 512 octets. Utile quand l'application gère son propre cache.
- zero-copy
- Une technique d'I/O qui transfère les données directement entre des buffers du noyau sans copie vers le user space. sendfile() et mmap sont deux implémentations courantes.
- sendfile
- System call qui transfère des données d'un FD de fichier vers un FD de socket directement au sein du noyau — sans copie vers le user space. Utilisé dans Nginx et les serveurs web pour servir des fichiers statiques.
- page cache
- Un buffer RAM dans le noyau qui stocke le contenu des fichiers récemment consultés. Les lectures répétées du même fichier sont servies depuis la RAM plutôt que depuis le disque.