stringtranslate.com

Copia cero

El término " copia cero " describe operaciones informáticas en las que la CPU no realiza la tarea de copiar datos de un área de memoria a otra o en las que se evitan copias innecesarias de datos. Esto se utiliza con frecuencia para ahorrar ciclos de CPU y ancho de banda de memoria en muchas tareas que consumen mucho tiempo, como cuando se transmite un archivo a alta velocidad a través de una red , etc., mejorando así el rendimiento de los programas ( procesos ) ejecutados por una computadora. [1] [2] [3] [4]

Principio

Las técnicas de programación de copia cero se pueden utilizar cuando se intercambian 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 datos/copiarlos/moverlos dentro del espacio del núcleo o entre un proceso de espacio de usuario y partes del espacio del núcleo de sistemas operativos (OS).

Generalmente, cuando un proceso de espacio de usuario tiene que ejecutar operaciones del sistema como leer o escribir datos desde/hacia un dispositivo (es decir, un disco , una NIC , 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 están ubicados dentro del espacio del kernel (es decir, dos archivos, un archivo y una tarjeta de red, etc.), entonces se pueden evitar copias de datos innecesarias, desde el espacio del kernel al espacio del usuario y desde el espacio del usuario al espacio del kernel, mediante llamadas de sistema especiales (copia cero), generalmente disponibles en las versiones más recientes de los sistemas operativos más populares.

Las versiones de copia cero de elementos del sistema operativo, como controladores de dispositivos , sistemas de archivos , pilas de protocolos de red , etc., aumentan en gran medida el rendimiento de ciertos programas de aplicación (que se convierten en procesos cuando se ejecutan) y utilizan los recursos del sistema de manera más eficiente. El rendimiento se mejora al permitir que la CPU avance a otras tareas mientras las copias/procesamiento de datos se realizan en paralelo en otra parte de la máquina. Además, las operaciones de copia cero reducen la cantidad de cambios de contexto que consumen mucho tiempo entre el espacio del usuario y el espacio del núcleo. Los recursos del sistema se utilizan de manera más eficiente ya que usar una CPU sofisticada para realizar operaciones extensas de copia de datos, que es una tarea relativamente simple, es un desperdicio si otros componentes del sistema más simples pueden realizar la copia.

Por ejemplo, leer un archivo y luego enviarlo a través de una red de la manera tradicional requiere 2 copias de datos adicionales (1 para leer desde el núcleo al espacio de usuario + 1 para escribir desde el usuario al espacio del núcleo) y 4 cambios de contexto por ciclo de lectura/escritura. Esas copias de datos adicionales utilizan la CPU. Enviar ese archivo mediante el uso de mmap de datos de 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 de usuario adicionales anteriores. Enviar el mismo archivo mediante copia cero reduce los cambios de contexto a 2 por llamada de sendfile y elimina todas las copias de datos adicionales de la CPU (tanto en el espacio de usuario como en el del núcleo). [1] [2] [3] [4]

Los protocolos de copia cero son especialmente importantes para redes de muy alta velocidad en las que la capacidad de un enlace de red se acerca o supera la capacidad de procesamiento de la CPU. En tal caso, la CPU puede pasar casi todo su tiempo copiando los datos transferidos y, por lo tanto, se convierte en un cuello de botella que limita la velocidad de comunicación por debajo de la capacidad del enlace. Una regla general que se utiliza 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 implementación temprana fue IBM OS/360 , donde un programa puede indicar al subsistema de canal que lea bloques de datos de un archivo o dispositivo en un búfer y escriba en otro desde el mismo búfer sin mover los datos.

Las técnicas para crear software sin copia incluyen el uso de copia basada en acceso directo a memoria (DMA) y mapeo de memoria a través de una unidad de administración de memoria (MMU). Estas características requieren soporte de hardware específico y, por lo general, implican requisitos particulares de alineación de memoria.

Un enfoque más nuevo utilizado por la Arquitectura de Sistemas Heterogéneos (HSA) facilita el paso de punteros entre la CPU y la GPU y también entre otros procesadores. Esto requiere un espacio de direcciones unificado para la CPU y la GPU. [5] [6]

Interfaces de programas

Varios sistemas operativos admiten la copia cero de datos de usuario y contenidos de archivos a través de API específicas .

Aquí se enumeran solo algunas llamadas de sistema/API 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 COPY interno 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 vuelve a la copia de archivos normal . El comando MOVE externo desde DR DOS 6.0 (1991) y MS-DOS 6.0 (1993) realiza internamente un RENAME (haciendo que sólo 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 están ubicados en el mismo volumen lógico. [8]

El kernel de Linux admite copia cero a través de varias llamadas del sistema, como:

Algunos de ellos están especificados en POSIX y, por lo tanto, también están presentes en los núcleos BSD o IBM AIX , algunos son exclusivos de la API del núcleo Linux .

FreeBSD , NetBSD , OpenBSD , DragonFly BSD , etc. admiten copia cero a través de al menos estas llamadas al sistema:

MacOS debería soportar copia cero a través de la parte FreeBSD del kernel porque ofrece las mismas llamadas al sistema (y sus páginas de manual todavía están etiquetadas como BSD) como:

Oracle Solaris admite copia cero a través de al menos estas llamadas del sistema:

Microsoft Windows admite copia cero al menos a través de esta llamada del sistema:

Los flujos de entrada de Java pueden admitir copia cero a través del método transferTo() de java.nio.channels.FileChannel si el sistema operativo subyacente también admite 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. ^ ab Stancevic, Dragan (1 de enero de 2003). "Zero Copy I: User-Mode Perspective". www.linuxjournal.com . Consultado el 14 de octubre de 2021 .
  2. ^ ab Bröse, Eduard (1 de enero de 2012). «ZeroCopy: técnicas, ventajas y desventajas». CiteSeerX 10.1.1.93.9589 .  {{cite journal}}: Requiere citar revista |journal=( ayuda )
  3. ^ ab Song, Jia; Alves-Foss, Jim (1 de enero de 2012). "Revisión del rendimiento de las técnicas de copia cero" (PDF) . www.uidaho.edu . Consultado el 14 de octubre de 2021 .
  4. ^ ab Baldwin, John (1 de mayo de 2020). "Descarga de TLS en el kernel" (PDF) . freebsdfoundation.org . Consultado el 14 de octubre de 2021 .
  5. ^ "La guía del programador para la galaxia APU" (PDF) .
  6. ^ "AMD describe la hoja de ruta de HSA: memoria unificada para CPU/GPU". 2 de febrero de 2012.
  7. ^ "Caldera OpenDOS Machine Readable Source Kit (MRS) 7.01". Caldera, Inc. 1 de mayo de 1997. Archivado desde el original el 7 de agosto de 2021. Consultado el 2 de enero de 2022 . [1] (NB. Implementado realmente desde DR DOS "Panther" el 22 de junio de 1992, consulte COMCPY.C/DOSIF.ASM en las fuentes de COMMAND.COM de OpenDOS 7.01 ).
  8. ^ 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 ) (NB. NWDOSTIP.TXT es un trabajo exhaustivo sobre Novell DOS 7 y OpenDOS 7.01, que incluye la descripción de muchas características y componentes internos no documentados. Es parte de la MPDOSTIP.ZIPcolección aún más grande del autor mantenida hasta 2001 y distribuida en muchos sitios en ese momento. El enlace proporcionado apunta a una versión anterior del NWDOSTIP.TXTarchivo convertida a HTML). [2]
  9. ^ "sendfile(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  10. ^ "splice(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  11. ^ "tee(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  12. ^ "vmsplice(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  13. ^ "process_vm_readv(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  14. ^ "process_vm_writev(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  15. ^ "copy_file_range(2) - Página del manual de Linux". man7.org . 2021-03-22 . Consultado el 2021-10-13 .
  16. ^ "Documentación de PACKET_MMAP de Linux". kernel.org .
  17. ^ "sendfile(2) - Páginas del manual de FreeBSD". www.freebsd.org . 2020-04-30 . Consultado el 2021-10-13 .
  18. ^ "write(2) - Páginas del manual de FreeBSD". www.freebsd.org . 2020-04-30 . Consultado el 2021-10-13 .
  19. ^ "writev(2) - Páginas del manual de FreeBSD". www.freebsd.org . 2020-04-30 . Consultado el 2021-10-13 .
  20. ^ "mmap(2) - Páginas del manual de FreeBSD". www.freebsd.org . 2020-04-30 . Consultado el 2021-10-13 .
  21. ^ "sendfile(2) - Página del manual de Mac OS X". developer.apple.com . 2006-03-31 . Consultado el 2021-10-13 .
  22. ^ "sendfile(3C) - Páginas del manual de Solaris". docs.oracle.com . 2021-08-13 . Consultado el 2021-10-13 .
  23. ^ "sendfilev(3C) - Páginas del manual de Solaris". docs.oracle.com . 2021-08-13 . Consultado el 2021-10-13 .
  24. ^ "write(2) - Páginas del manual de Solaris". docs.oracle.com . 2021-08-13 . Consultado el 2021-10-13 .
  25. ^ "writev(2) - Páginas del manual de Solaris". docs.oracle.com . 2021-08-13 . Consultado el 2021-10-13 .
  26. ^ "mmap(2) - Páginas del manual de Solaris". docs.oracle.com . 2021-08-13 . Consultado el 2021-10-13 .
  27. ^ "Función TransmitFile (Win32)". docs.microsoft.com . 2021-05-10 . Consultado el 2021-10-13 .
  28. ^ 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 .