En Linux, OSX, Solaris (y algunos otros sistemas similares a Unix), tiene la llamada al sistema sendfile(2)
que copia datos de un descriptor de archivo a otro descriptor de archivo, evitando así la copia en memoria de datos a / desde un búfer en espacio de usuario Tenga en cuenta que copia datos a través de descriptores de archivos genéricos (por lo que incluye tuberías / fifos y sockets), no solo archivos normales, ya que el nombre podría sugerir a los distraídos. En Microsoft Windows (aparentemente desde Windows 8) hay TransmitFile()
que hace aproximadamente lo mismo.
En Linux también existe la llamada al sistema splice(2)
, que adopta un enfoque más general para el mismo problema.
Esto no significa que puede hacer un cliente-servidor completamente sin usar buffers, pero al menos, al hacer transferencias de datos masivas, no tendrá que copiar datos de un lado a otro en el kernelspace y el espacio de usuario, lo que ahorra bastante de recursos.
- ¿Por qué es rápido descargar un archivo grande, mientras que descargar muchos archivos pequeños de diferentes fuentes es mucho más lento?
- ¿Qué es la tecnología de red de transporte de paquetes?
- ¿Cómo podemos calcular fácilmente la próxima ip de una subred compleja?
- ¿Las direcciones IP del país / ciudad siempre permanecen iguales?
- ¿Qué es un flujo de bytes?
Editar : dicho eso, solo para archivos regulares, creo que también existe la opción de mmap(2)
un archivo regular (es decir, mapear un archivo regular en un espacio de direcciones), y luego usar llamadas regulares read(2)
y write(2)
en la región mapeada en memoria. Pero en este caso, debe saber de antemano la longitud de los datos ( mmap(2)
requiere un argumento de longitud distinta de cero), que es fácil cuando se envían datos desde archivos normales, pero menos fácil cuando se reciben datos.