stringtranslate.com

Copiar en escritura

Copiar en escritura ( COW ), a veces denominado uso compartido implícito [1] o sombreado , [2] es una técnica de gestión de recursos utilizada en programación informática para implementar de manera eficiente una operación de "duplicado" o "copia" en recursos modificables [3] (más comúnmente páginas de memoria, sectores de almacenamiento, archivos y 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 el espacio de direcciones por completo. Se desperdiciaría tiempo de procesador y memoria copiar toda la memoria del proceso anterior durante la bifurcación solo para descartar inmediatamente la copia. [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 llevando un recuento 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 se puede omitir si solo hay una referencia. Luego, el núcleo actualiza la tabla de páginas con la nueva página (escribible), disminuye 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 en otro. [ cita requerida ]

La técnica de copia en escritura se puede ampliar para permitir una asignación eficiente de memoria 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 todas están marcadas como copia en escritura. De esta manera, la memoria física no se asigna para el proceso hasta que se escriben los datos, lo que permite que los procesos reserven más memoria virtual que memoria física y utilicen la memoria de forma dispersa, con el riesgo de quedarse sin espacio de direcciones virtuales. El algoritmo combinado es similar a la paginación por demanda . [3]

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

En software

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

Ejemplos

La clase de cadena 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 nuevo C++11: [7]

std :: string x ( "Hola" ); std :: string y = x ; // x e y usan el mismo buffer.    y += ", World!" ; // Ahora y usa un buffer diferente; x todavía usa el mismo buffer antiguo.   

En el lenguaje de programación PHP , todos los tipos, excepto las referencias, se implementan como tipos de copia en escritura. Por ejemplo, las cadenas y las matrices se pasan por referencia, pero cuando se modifican, se duplican si tienen recuentos de referencia distintos de cero. Esto les permite actuar como tipos de valor sin los problemas de rendimiento de la copia en la asignación o de hacerlos inmutables. [8]

En el marco de Qt , muchos tipos son de copia al escribir ("compartidos implícitamente" en términos de Qt). Qt utiliza operaciones atómicas de comparación e intercambio para incrementar o decrementar el contador de referencia interno. Dado que las copias son económicas, los tipos de Qt a menudo pueden ser utilizados de forma segura por múltiples subprocesos sin la necesidad de mecanismos de bloqueo como los mutex . Por lo tanto, los beneficios de COW son válidos tanto en sistemas de un solo subproceso como en sistemas de múltiples subprocesos. [9]

En el almacenamiento de la computadora

COW también puede utilizarse como mecanismo subyacente para las instantáneas , como las proporcionadas por la gestión de volúmenes lógicos , sistemas de archivos como Btrfs , ZFS , ReFS y Bcachefs , [10] y servidores de bases de datos como Microsoft SQL Server . Normalmente, las instantáneas almacenan solo los datos modificados y se almacenan cerca del original, por lo que son solo una forma débil de copia de seguridad incremental y no pueden sustituir a una copia de seguridad completa . [11]

Véase también

Referencias

  1. ^ "Compartir implícitamente". Proyecto Qt . Archivado desde el original el 8 de febrero de 2024. Consultado el 10 de noviembre de 2023 .
  2. ^ Rodeh, Ohad (1 de febrero de 2008). «B-Trees, Shadowing, and Clones» (PDF) . ACM Transactions on Storage . 3 (4): 1. CiteSeerX 10.1.1.161.6863 . doi :10.1145/1326542.1326544. S2CID  207166167. Archivado desde el original (PDF) el 2 de enero de 2017 . Consultado el 10 de noviembre de 2023 . 
  3. ^ ab Bovet, Daniel Pierre; Cesati, Marco (1 de enero de 2002). Entendiendo el núcleo de Linux. O'Reilly Media. p. 295. ISBN 9780596002138Archivado desde el 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 Kernel Samepage". alouche.net . Archivado desde el original el 8 de agosto de 2016 . Consultado el 10 de noviembre de 2023 .{{cite web}}: CS1 maint: URL no apta ( enlace )
  6. ^ Meyers, Scott (2012). STL eficaz . Addison-Wesley. págs. 64-65. ISBN 9780132979184.
  7. ^ "Modificaciones de concurrencia en cadenas básicas". Estándares abiertos . Archivado desde el 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 la memoria». PhpInternalsBook.com . Archivado desde el original el 10 de noviembre de 2023. Consultado el 10 de noviembre de 2023 .
  9. ^ "Hilos y clases compartidas implícitamente". Proyecto Qt . Archivado desde el original el 3 de diciembre de 2023. Consultado el 10 de noviembre de 2023 .
  10. ^ Kasampalis, Sakis (2010). "Análisis del rendimiento y la implementación de sistemas de archivos basados ​​en copia por escritura" (PDF) . pág. 19. Archivado (PDF) desde el original el 5 de mayo de 2024. Consultado el 10 de noviembre de 2023 .
  11. ^ Chien, Tim. "Las instantáneas NO son copias de seguridad". Oracle.com . Oracle. Archivado desde el original el 10 de noviembre de 2023 . Consultado el 10 de noviembre de 2023 .