En informática , la copia cero se refiere a técnicas que permiten la transferencia de datos entre espacios de memoria sin que la CPU tenga que copiarlos. Al evitar copias redundantes, los métodos de copia cero minimizan el uso de la CPU y el ancho de banda de la memoria , lo que se traduce en mejoras sustanciales del rendimiento. Esto es crucial para aplicaciones que requieren un alto rendimiento de datos, como la comunicación en red, la entrada/salida de archivos y el procesamiento multimedia. [ 1 ] [ 2 ] [ 3 ] [ 4 ]
Principio
Las técnicas de programación de copia cero se pueden utilizar al intercambiar datos dentro de un proceso de espacio de usuario (es decir, entre dos o más subprocesos , etc.) y/o entre dos o más procesos (véase también el problema productor-consumidor ) y/o cuando se debe acceder a los datos, copiarlos o moverlos dentro del espacio del kernel o entre un proceso de espacio de usuario y partes del espacio del kernel de los sistemas operativos (SO).
Normalmente, cuando un proceso del espacio de usuario tiene que ejecutar operaciones del sistema, como leer o escribir datos desde/hacia un dispositivo (es decir, un disco , una tarjeta de red , etc.) a través de sus interfaces de software de alto nivel , o como mover datos de un dispositivo a otro, etc., tiene que realizar una o más llamadas al sistema que luego son ejecutadas en el espacio del kernel por el sistema operativo.
Si es necesario copiar o mover datos desde el origen al destino y ambos se encuentran dentro del espacio del kernel (es decir, dos archivos, un archivo y una tarjeta de red, etc.), entonces se pueden evitar las copias de datos innecesarias, del espacio del kernel al espacio del usuario y del espacio del usuario al espacio del kernel, mediante el uso de llamadas al sistema especiales (de copia cero), que generalmente están disponibles en las versiones más recientes de los sistemas operativos más populares.
Las versiones sin copia de elementos del sistema operativo, como controladores de dispositivos , sistemas de archivos , pilas de protocolos de red , etc., aumentan considerablemente el rendimiento de ciertos programas de aplicación (que se convierten en procesos al ejecutarse) y utilizan los recursos del sistema de forma más eficiente. El rendimiento mejora al permitir que la CPU se dedique a otras tareas mientras las copias y el procesamiento de datos se realizan en paralelo en otra parte del sistema. Además, las operaciones sin copia reducen la cantidad de cambios de contexto que consumen mucho tiempo entre el espacio de usuario y el espacio del kernel. Los recursos del sistema se utilizan de forma más eficiente, ya que usar una CPU sofisticada para realizar operaciones de copia de datos extensas, una tarea relativamente sencilla, resulta un desperdicio si otros componentes del sistema más simples pueden realizar la copia.
Por ejemplo, leer un archivo y enviarlo a través de una red de la forma tradicional requiere 2 copias de datos adicionales (1 para leer del espacio del kernel al espacio del usuario + 1 para escribir del espacio del usuario al espacio del kernel) y 4 cambios de contexto por ciclo de lectura/escritura. Estas copias de datos adicionales consumen CPU. Enviar ese archivo usando mmap de los datos del archivo y un ciclo de llamadas de escritura reduce los cambios de contexto a 2 por llamada de escritura y evita esas 2 copias de datos adicionales de usuario anteriores. Enviar el mismo archivo mediante copia cero reduce los cambios de contexto a 2 por llamada sendfile y elimina todas las copias de datos adicionales de CPU (tanto en el espacio del usuario como en el del kernel). [ 1 ] [ 2 ] [ 3 ] [ 4 ]
Los protocolos de copia cero son especialmente importantes para redes de muy alta velocidad, donde la capacidad del enlace de red se aproxima o supera la capacidad de procesamiento de la CPU. En tales casos, la CPU puede dedicar casi todo su tiempo a copiar los datos transferidos, convirtiéndose así en un cuello de botella que limita la velocidad de comunicación por debajo de la capacidad del enlace. Una regla general utilizada en la industria es que se necesita aproximadamente un ciclo de reloj de la CPU para procesar un bit de datos entrantes.
Implementaciones de hardware
Una de las primeras implementaciones fue IBM OS/360, donde un programa puede indicar al subsistema de canales que lea bloques de datos de un archivo o dispositivo a un búfer y escriba en otro desde el mismo búfer sin mover los datos.
Las técnicas para crear software sin copias incluyen el uso de acceso directo a memoria (DMA) y la asignación de memoria mediante una unidad de gestión de memoria (MMU). Estas funciones requieren soporte de hardware específico y suelen implicar requisitos particulares de alineación de memoria.
Un enfoque más reciente utilizado por la Arquitectura de Sistema Heterogéneo (HSA) facilita el paso de punteros entre la CPU y la GPU , así como entre otros procesadores. Esto requiere un espacio de direcciones unificado para la CPU y la GPU. [ 5 ] [ 6 ]
Interfaces de programa
Varios sistemas operativos admiten la copia cero de datos de usuario y contenido de archivos a través de API específicas .
Aquí se enumeran solo algunas de las llamadas al sistema/API más conocidas disponibles en los sistemas operativos más populares.
Novell NetWare admite una forma de copia cero a través de bloques de control de eventos (ECB), consulte NCOPY .
El comando interno COPY en algunas versiones de DR-DOS desde 1992 también inicia esto cuando COMMAND.COM detecta que los archivos que se van a copiar están almacenados en un servidor de archivos NetWare, [ 7 ] de lo contrario, recurre a la copia normal de archivos . El comando externo MOVE desde DR DOS 6.0 (1991) y MS-DOS 6.0 (1993) realiza internamente un RENAME (lo que provoca que solo se modifiquen las entradas del directorio en el sistema de archivos en lugar de copiar físicamente los datos del archivo) cuando el origen y el destino se encuentran en el mismo volumen lógico. [ 8 ]
El kernel de Linux admite la copia cero a través de varias llamadas al sistema, tales como:
- sendfile, sendfile64; [ 9 ]
- empalme ; [ 10 ]
- camiseta; [ 11 ]
- vmsplice; [ 12 ]
- process_vm_readv; [ 13 ]
- process_vm_writev; [ 14 ]
- rango_de_archivos_copiados; [ 15 ]
- sockets sin procesar con mmap de paquetes [ 16 ] o AF_XDP .
Algunas de ellas están especificadas en POSIX y, por lo tanto, también están presentes en los núcleos BSD o IBM AIX ; otras son exclusivas de la API del núcleo Linux .
FreeBSD , NetBSD , OpenBSD , DragonFly BSD , etc. admiten la copia cero a través de al menos estas llamadas al sistema:
- enviar archivo; [ 17 ]
- escribir, [ 18 ] writev [ 19 ] + mmap [ 20 ] al escribir datos en un socket de red.
macOS debería admitir la copia cero a través de la parte del kernel de FreeBSD porque ofrece las mismas llamadas al sistema (y sus páginas de manual todavía están etiquetadas como BSD), tales como:
- enviar archivo. [ 21 ]
Oracle Solaris admite la copia cero mediante al menos estas llamadas al sistema:
Microsoft Windows admite la copia cero al menos a través de esta llamada al sistema:
- TransmitirArchivo. [ 27 ]
Los flujos de entrada de Java pueden admitir la copia cero a través del método transferTo() de java.nio.channels.FileChannel si el sistema operativo subyacente también admite la copia cero. [ 28 ]
Los protocolos RDMA (Acceso Directo a Memoria Remota) dependen en gran medida de técnicas de copia cero.
Véase también
Referencias
- 1 2 Stancevic, Dragan (2003-01-01). "Zero Copy I: Perspectiva del modo de usuario" . www.linuxjournal.com . Recuperado el 14 de octubre de 2021 .
- 1 2 Bröse, Eduard (2012-01-01). "ZeroCopy: Técnicas, Beneficios y Peligros". CiteSeerX 10.1.1.93.9589 .
{{cite journal}}: Para citar una revista se requiere|journal=( ayuda ) - 1 2 Song, Jia; Alves-Foss, Jim (2012-01-01). "Revisión del desempeño de las técnicas de copia cero" (PDF) . www.uidaho.edu . Archivado del original (PDF) el 2022-07-03 . Recuperado el 2021-10-14 .
- 1 2 Baldwin, John (2020-05-01). "TLS offload in the kernel" (PDF) . freebsdfoundation.org . Recuperado el 2021-10-14 .
- ↑ "La guía del programador para la galaxia APU" (PDF) .
- ↑ "AMD presenta la hoja de ruta de HSA: Memoria unificada para CPU/GPU" . 2 de febrero de 2012. Archivado del original el 4 de febrero de 2012.
- ↑ "Caldera OpenDOS Machine Readable Source Kit (MRS) 7.01" . Caldera, Inc. 1997-05-01. Archivado del original el 2021-08-07 . Consultado el 2022-01-02 .(Nota: Implementado desde DR DOS "Panther" el 22/06/1992; véase COMCPY.C/DOSIF.ASM en el código fuente de COMMAND.COM de OpenDOS 7.01 ).
- ^ Paul, Matthias R. (30 de julio de 1997) [1 de mayo de 1994]. "II.4. Undokumentierte Eigenschaften externer Kommandos: MOVE.EXE". NWDOS-TIP : consejos y trucos para Novell DOS 7, con un clic para deshacer detalles, errores y soluciones . Versión 157 (en alemán) (3 ed.). Archivado desde el original el 10 de septiembre de 2017 . Consultado el 6 de agosto de 2014 .
{{cite book}}:|work=ignorado ( ayuda ) (Nota: NWDOSTIP.TXT es una obra exhaustiva sobre Novell DOS 7 y OpenDOS 7.01, que incluye la descripción de muchas características y aspectos internos no documentados. Forma parte de la colección, aún más extensa, del autor, mantenida hasta 2001 y distribuida en numerosos sitios web en aquella época. El enlace proporcionado apunta a una versión anterior del archivo convertida a HTML).MPDOSTIP.ZIPNWDOSTIP.TXT - ↑ "sendfile(2) - Página del manual de Linux" . man7.org . 22/03/2021 . Consultado el 13/10/2021 .
- ↑ "splice(2) - Página del manual de Linux" . man7.org . 22 de marzo de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "tee(2) - Página del manual de Linux" . man7.org . 22 de marzo de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "vmsplice(2) - Página del manual de Linux" . man7.org . 22 de marzo de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "process_vm_readv(2) - Página del manual de Linux" . man7.org . 22 de marzo de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "process_vm_writev(2) - Página del manual de Linux" . man7.org . 22 de marzo de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "copy_file_range(2) - Página del manual de Linux" . man7.org . 22/03/2021 . Consultado el 13/10/2021 .
- ↑ "Documentación de PACKET_MMAP de Linux" . kernel.org .
- ↑ "sendfile(2) - Páginas del manual de FreeBSD" . www.freebsd.org . 30 de abril de 2020. Consultado el 13 de octubre de 2021 .
- ↑ "write(2) - Páginas del manual de FreeBSD" . www.freebsd.org . 30 de abril de 2020. Consultado el 13 de octubre de 2021 .
- ↑ "writev(2) - Páginas del manual de FreeBSD" . www.freebsd.org . 30 de abril de 2020. Consultado el 13 de octubre de 2021 .
- ↑ "mmap(2) - Páginas del manual de FreeBSD" . www.freebsd.org . 30 de abril de 2020. Consultado el 13 de octubre de 2021 .
- ↑ "sendfile(2) - Página del manual de Mac OS X" . developer.apple.com . 31 de marzo de 2006. Consultado el 13 de octubre de 2021 .
- ↑ "sendfile(3C) - Páginas del manual de Solaris" . docs.oracle.com . 13 de agosto de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "sendfilev(3C) - Páginas del manual de Solaris" . docs.oracle.com . 13 de agosto de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "write(2) - Páginas del manual de Solaris" . docs.oracle.com . 13 de agosto de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "writev(2) - Páginas del manual de Solaris" . docs.oracle.com . 13 de agosto de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "mmap(2) - Páginas del manual de Solaris" . docs.oracle.com . 13 de agosto de 2021. Consultado el 13 de octubre de 2021 .
- ↑ "Función TransmitFile (Win32)" . docs.microsoft.com . 10/05/2021 . Consultado el 13/10/2021 .
- ^ Palaniappan, Sathish K.; Nagaraja, Pramod B. (2 de septiembre de 2008). "Copia cero de Java" . desarrollador.ibm.com . Consultado el 13 de octubre de 2021 .
- Optimización de software
- jerga informática