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).
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]
COW también se utiliza en códigos de bibliotecas , aplicaciones y sistemas .
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]
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]
{{cite web}}
: CS1 maint: URL no apta ( enlace )