¿Qué es copy-on-write?

Me gustaría saber qué es copy-on-write y para qué se utiliza. El término “matriz de copia-en-escritura” se menciona varias veces en los tutoriales de Sun JDK, pero no entendí lo que significaba.

Iba a escribir mi propia explicación, pero este artículo de Wikipedia prácticamente lo resume.

Aquí está el concepto básico:

Copy-on-write (a veces denominado “COW”) es una estrategia de optimización utilizada en la progtwigción de computadoras. La idea fundamental es que si varias personas que llaman piden recursos que son inicialmente indistinguibles, puede darles punteros al mismo recurso. Esta función se puede mantener hasta que una persona que llama intente modificar su “copia” del recurso, momento en el que se crea una copia privada verdadera para evitar que los cambios se vuelvan visibles para todos los demás. Todo esto sucede de forma transparente a las personas que llaman. La principal ventaja es que si una persona que realiza la llamada nunca realiza ninguna modificación, nunca será necesario crear una copia privada.

También aquí hay una aplicación de un uso común de COW:

El concepto COW también se utiliza en el mantenimiento de instantáneas instantáneas en servidores de bases de datos como Microsoft SQL Server 2005. Las instantáneas instantáneas conservan una vista estática de una base de datos almacenando una copia de datos previa a la modificación cuando se actualizan los datos subyacentes. Las instantáneas instantáneas se utilizan para probar usos o informes dependientes del momento y no se deben usar para reemplazar copias de seguridad.

“Copiar al escribir” significa más o menos lo que parece: todos tienen una sola copia compartida de los mismos datos hasta que se escribe , y luego se realiza una copia. Usualmente, copy-on-write se usa para resolver géneros de simultaneidad de problemas. En ZFS, por ejemplo, a los bloques de datos en el disco se les asigna copy-on-write; mientras no haya cambios, mantengas los bloques originales; un cambio solo cambió los bloques afectados. Esto significa que se asigna la cantidad mínima de bloques nuevos.

Estos cambios también suelen implementarse para ser transaccionales , es decir, tienen las propiedades ACID. Esto elimina algunos problemas de concurrencia, porque entonces se garantiza que todas las actualizaciones son atómicas.

Solo para brindar otro ejemplo, Mercurial usa el copy-on-write para hacer que la clonación de repositorys locales sea una operación realmente “barata”.

El principio es el mismo que los otros ejemplos, excepto que está hablando de archivos físicos en lugar de objetos en la memoria. Inicialmente, un clon no es un duplicado sino un enlace rígido al original. A medida que cambia los archivos en el clon, se escriben copias para representar la nueva versión.

No repetiré la misma respuesta en Copy-on-Write. Creo que la respuesta de Andrew y la respuesta de Charlie ya lo han dejado muy claro. Le daré un ejemplo del mundo OS, solo para mencionar cuán ampliamente se usa este concepto.

Podemos usar fork() o vfork() para crear un nuevo proceso. vfork sigue el concepto de copy-on-write. Por ejemplo, el proceso hijo creado por vfork compartirá los datos y el segmento de código con el proceso principal. Esto acelera el tiempo de horquilla. Se espera que use vfork si está ejecutando exec seguido de vfork. Entonces, vfork creará el proceso hijo que compartirá los datos y el segmento de código con su principal, pero cuando llamemos a exec, cargará la imagen de un nuevo ejecutable en el espacio de direcciones del proceso hijo.

También se usa en Ruby ‘Enterprise Edition’ como una forma ordenada de guardar memoria.

Encontré este buen artículo sobre zval en PHP, que también mencionaba VACA:

Copy On Write (abreviado como ‘COW’) es un truco diseñado para ahorrar memoria. Se usa más generalmente en ingeniería de software. Significa que PHP copiará la memoria (o asignará una nueva región de memoria) cuando escriba en un símbolo, si este ya estaba apuntando a un zval.