Articulo de referencia

Copia en escritura

La copia en escritura ( COW ), también llamada compartición implícita [ 1 ] o sombreado [ 2 ], es una técnica de gestión de recursos [ 3 ] utilizada en programación para gestion...

La copia en escritura ( COW ), también llamada compartición implícita [ 1 ] o sombreado [ 2 ], es una técnica de gestión de recursos [ 3 ] utilizada en programación para gestionar datos compartidos de forma eficiente. En lugar de copiar los datos inmediatamente cuando varios programas los utilizan, los mismos datos se comparten entre programas hasta que uno intenta modificarlos. Si no se realizan cambios, no se crea ninguna copia privada, lo que ahorra recursos [ 3 ] . Solo se crea una copia cuando es necesaria, lo que garantiza que cada programa tenga su propia versión cuando se produzcan modificaciones. Esta técnica se aplica comúnmente a la memoria, los archivos y las estructuras de datos.

En la gestión de memoria virtual

La copia en escritura encuentra su principal uso en sistemas operativos , compartiendo la memoria física de computadoras que ejecutan múltiples procesos , en la implementación de la llamada al sistema fork() . Normalmente, el nuevo proceso no modifica ninguna memoria e inmediatamente ejecuta un nuevo proceso, reemplazando por completo el espacio de direcciones. Copiar toda la memoria del proceso anterior durante la bifurcación solo para descartar inmediatamente la copia supondría un desperdicio de tiempo de procesador y memoria. [ 4 ]

La copia en escritura se puede implementar de manera eficiente utilizando la tabla de páginas , marcando ciertas páginas de memoria como de solo lectura y manteniendo un conteo del número de referencias a la página. Cuando se escriben datos en estas páginas, el núcleo del sistema operativo intercepta el intento de escritura y asigna una nueva página física, inicializada con los datos de copia en escritura, aunque la asignación puede omitirse si solo hay una referencia. A continuación, el núcleo actualiza la tabla de páginas con la nueva página (escribible), decrementa el número de referencias y realiza la escritura. La nueva asignación garantiza que un cambio en la memoria de un proceso no sea visible para otro.

La técnica de copia en escritura se puede extender para admitir una asignación de memoria eficiente manteniendo una página de memoria física llena de ceros. Cuando se asigna la memoria, todas las páginas devueltas hacen referencia a la página de ceros y se marcan como de copia en escritura. De esta manera, la memoria física no se asigna al proceso hasta que se escriben los datos, lo que permite a los procesos reservar más memoria virtual que memoria física y usar la memoria de forma dispersa, con el riesgo de quedarse sin espacio de direcciones virtuales. El algoritmo combinado es similar a la paginación bajo demanda . [ 3 ]

Las páginas de copia en escritura también se utilizan en la función de fusión de páginas idénticas del kernel de Linux . [ 5 ]

En software

COW también se utiliza en el código de bibliotecas , aplicaciones y sistemas .

Ejemplos

La clase string proporcionada por la biblioteca estándar de C++ fue diseñada específicamente para permitir implementaciones de copia en escritura en el estándar inicial C++98, [ 6 ] pero no en el estándar más reciente C++11: [ 7 ]

std :: string x ( "Hola" );std :: string y = x ; // x e y usan el mismo búfer.y += ", ¡Mundo!" ; // Ahora y usa un búfer diferente; x sigue usando el mismo búfer antiguo.

En el lenguaje de programación PHP , todos los tipos, excepto las referencias, se implementan como de copia en escritura. Por ejemplo, las cadenas y los arreglos se pasan por referencia, pero al modificarse, se duplican si tienen un número de referencias distinto de cero. Esto les permite comportarse como tipos de valor sin los problemas de rendimiento que implica la copia en la asignación o la inmutabilidad. [ 8 ]

En el framework Qt , muchos tipos son de copia en escritura (o "compartidos implícitamente", según la terminología de Qt). Qt utiliza operaciones atómicas de comparación e intercambio para incrementar o decrementar el contador de referencias interno. Dado que las copias son económicas, los tipos de Qt a menudo pueden ser utilizados de forma segura por múltiples hilos sin necesidad de mecanismos de bloqueo como los mutex . Por lo tanto, las ventajas de la copia en escritura son válidas tanto en sistemas de un solo hilo como en sistemas multihilo. [ 9 ]

En Docker , un conjunto de software para implementar la virtualización a nivel de sistema operativo , las imágenes de Docker se construyen en un formato por capas, donde las capas inferiores son de solo lectura y la capa superior está disponible para su edición. Al crear una nueva imagen que comparte las mismas capas base que otra imagen, no se copian las capas, sino que se siguen los principios de COW (Copy-On-Write) y se permite que ambas imágenes compartan capas hasta que una de ellas sea editada. [ 10 ] [ 11 ]

En el almacenamiento informático

COW se utiliza como mecanismo subyacente en sistemas de archivos como ZFS , Btrfs , [ 12 ] ReFS , APFS , F2FS y Bcachefs , así como en la gestión de volúmenes lógicos y servidores de bases de datos como Microsoft SQL Server .

En los sistemas de archivos tradicionales, la modificación de un archivo sobrescribe los bloques de datos originales. En un sistema de archivos de copia en escritura (COW), los bloques originales permanecen sin cambios. Cuando se modifica parte de un archivo, solo los bloques afectados se escriben en nuevas ubicaciones y los metadatos se actualizan para apuntar a ellas, conservando la versión original hasta que ya no sea necesaria. Este enfoque permite funciones como las instantáneas , que capturan el estado de un archivo en un momento específico sin consumir mucho espacio adicional. Las instantáneas suelen almacenar solo los datos modificados y se mantienen cerca del original. Sin embargo, se consideran una forma débil de copia de seguridad incremental y no pueden reemplazar una copia de seguridad completa. [ 13 ]

Para crear e iniciar nuevos contenedores rápidamente, los motores de contenedores que realizan virtualización a nivel de sistema operativo suelen realizar una copia en escritura en el almacenamiento, ya sea una copia en escritura a nivel de bloque (como se describió anteriormente) o una copia en escritura a nivel de archivo.

Algunos sistemas de archivos, pero no todos, admiten la copia en escritura a nivel de archivo como parte del montaje de unión , [ 14 ] incluidos OverlayFS , aufs , GlusterFS y UnionFS .

Véase también

Referencias

  1. "Compartición implícita" . Proyecto Qt . Archivado del original el 8 de febrero de 2024. Consultado el 10 de noviembre de 2023 .
  2. Rodeh, Ohad (1 de febrero de 2008). "Árboles B, sombreado y clones" (PDF) . ACM Transactions on Storage . 3 (4): 1. CiteSeerX 10.1.1.161.6863 . doi : 10.1145/1326542.1326544 . S2CID 207166167. Archivado del original (PDF) el 2 de enero de 2017. Recuperado el 10 de noviembre de 2023 .  
  3. ^ Bovet , Daniel Pierre ; Cesati, Marco (1 de enero de 2002). Comprender el kernel de Linux . Medios O'Reilly. pag. 295.ISBN  9780596002138Archivado del original el 15 de septiembre de 2024. Consultado el 10 de noviembre de 2023 .
  4. Silberschatz, Abraham; Galvin, Peter B.; Gagne, Greg (2018). Conceptos de sistemas operativos (10.ª ed.). Wiley. págs. 120–123 . ISBN   978-1119456339.
  5. Abbas, Ali. "El proceso de fusión de páginas idénticas del kernel" . alouche.net . Archivado del original el 8 de agosto de 2016. Consultado el 10 de noviembre de 2023 .
  6. Meyers, Scott (2012). Effective STL . Addison-Wesley. págs. 64–65 . ISBN  9780132979184.
  7. "Modificaciones de concurrencia a la cadena básica" . Estándares abiertos . Archivado del original el 10 de noviembre de 2023. Consultado el 10 de noviembre de 2023 .
  8. Pauli, Julien; Ferrara, Anthony; Popov, Nikita (2013). "Gestión de memoria" . PhpInternalsBook.com . Archivado del original el 10 de noviembre de 2023. Recuperado el 10 de noviembre de 2023 .
  9. "Hilos y clases compartidas implícitamente" . Proyecto Qt . Archivado del original el 3 de diciembre de 2023. Consultado el 10 de noviembre de 2023 .
  10. "Controladores de almacenamiento" . Documentación de Docker . 13 de noviembre de 2025. Consultado el 23 de noviembre de 2025 .
  11. Tiwari, Anjaneya (18 de diciembre de 2024). "🔍 Entendiendo el almacenamiento de Docker: capas de imagen, copia en escritura y cómo funcionan los cambios de datos" . Medium . Recuperado el 23 de noviembre de 2025 .
  12. Kasampalis, Sakis (2010). "Análisis e implementación del rendimiento de sistemas de archivos basados ​​en copia en escritura" (PDF) . pág. 19. Archivado (PDF) del original el 5 de mayo de 2024. Recuperado el 10 de noviembre de 2023 . 
  13. Chien, Tim. "Las instantáneas NO son copias de seguridad" . Oracle.com . Oracle. Archivado del original el 10 de noviembre de 2023. Recuperado el 10 de noviembre de 2023 .
  14. Neil Brown. "Sistema de archivos superpuesto" .
  • "Historia de la gestión de memoria mediante copia en escritura" . Una comprensión aguda de lo obvio . 21 de enero de 2011. Consultado el 18 de noviembre de 2024 .