En 1999, Linux 2.2 introduit l'appel système sendfile() qui sert à copier des données d'un fichier vers un autre fichier sans passer par l'espace utilisateur.

En 2002, Janet Morgan retravaille les appels systèmes readv() et writev() et réussi à les accélérer entre 5 et 10 fois. Ces appels systèmes existent depuis le début de Linux.

Janvier 2005, Linus Torvald propose une nouvelle API des pipes. L'API pourrait servir à créer une implémentation de splice() : fonction qui copie des données d'un fichier vers un autre, uniquement en espace noyau et en limitant les copies mémoires. Par contre, au moins un des fichiers doit être un pipe.

Nombre 2005, Zach Brown propose des versions asynchrones de readv() et writev(). Les développeurs noyau préférant ne pas ajouter de nouvelles fonctions, Christoph Hellwig et Badari Pulavarty retravaillent le patch (février 2006) pour remplacer readv()/writev() en interne par aio_read()/aio_write(). L'article Asynchronous I/O and vectored operations détaille ces améliorations.

Avril 2006, Jens Axboe propose trois nouveaux appels systèmes splice(), vmsplice() et tee(), qui seront intégré en juin 2006 dans Linux 2.6.17. La fonction splice repose la nouvelle API sur les pipes de Linus Torvald. La fonction tee est similaire à splice sauf qu'elle ne consomme pas la source. Enfin, vmsplice() permet d'envoyer des données depuis l'espace utilisateur vers le tampon d'un pipe en espace noyau. Pour mieux comprendre, voici un exemple qui copie l'entrée standard (stdin) à la fois dans la sortie standard (stdout) et dans un fichier (file_fd) :

len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
splice(STDIN_FILENO, file_fd, len, 0);

D'une manière générale, toutes les fonctions ne travaillant qu'en espace noyau limitent au maximum les copies de page mémoire. Copier une page revient à rajouter une référence à la page, ce qui est beaucoup moins coûteux en temps de calcul.

Pour finir, je vous conseille la lecture de l'article The C10K problem qui explique en long et en large comment supporter 10.000 clients réseaux sur un seul serveur.