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]
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.
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]
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.
{{cite journal}}
: Requiere citar revista |journal=
( ayuda ){{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.ZIP
colecció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.TXT
archivo convertida a HTML). [2]