Copy-on-write
# Copy-on-write

En Informática, copy-on-write (inglés para «copiar al escribir», a veces abreviado COW) es una política de optimización utilizada en programación. Si múltiples procesos piden recursos que inicialmente son indistinguibles (iguales), se les devuelven punteros al mismo recurso; en el momento en que un proceso intenta modificar su "copia" del recurso, se crea una copia auténtica para prevenir que los cambios producidos por dicho proceso sean visibles por todos los demás. Todo ocurre de forma transparente para los procesos. La principal ventaja de este método es que no se crea ninguna copia adicional del recurso si ningún proceso llega a realizar modificaciones.

## Copy-on-write en memoria virtual

Copy-on-write es útil principalmente en memoria virtual. Cuando un proceso crea una copia de sí mismo, las páginas cargadas en memoria que puedan ser modificadas por dicho proceso o su copia se marcan como copy-on-write. Cuando un proceso modifica la memoria, el núcleo del sistema operativo interviene en la operación y crea una copia de forma que los cambios en la memoria ocupada por un proceso no son visibles por el otro.

La función calloc también puede aprovechar esta estrategia teniendo una página de memoria física escrita totalmente con ceros. Cuando se asigna la memoria, todas las páginas devueltas refieren a la página de ceros y se marcan como copy-on-write. De esta manera, la memoria reservada por el proceso no aumenta mientras no se realicen operaciones de escritura. Normalmente, esto se hace solamente para reservas de una gran cantidad de memoria.

La estrategia copy-on-write se puede implementar especificando en la unidad de manejo de memoria que ciertas páginas en el espacio de direcciones del proceso son de solo lectura. Cuando se intenta escribir en tales páginas, la unidad de manejo de memoria lanza una excepción, es capturada y manejada por el núcleo, que tras las comprobaciones oportunas decide bien emitir una señal de violación de acceso, bien reservar nueva memoria y escribir en esta última la página modificada.

Una gran ventaja de COW es su escaso uso de memoria. Dado que el uso de memoria física solo aumenta cuando se realizan operaciones de escritura, es posible implementar tablas hash muy eficientes que solo utilizan una pequeña cantidad adicional de la memoria necesaria para almacenar los objetos que contienen. Sin embargo, los programas implementados de este modo corren el riesgo de salirse de su espacio de direcciones virtual; las páginas en memoria virtual no utilizadas por la tabla hash no podrían ser accedidas por otras partes del programa. El principal problema de COW al nivel del núcleo es la complejidad que añade, aunque no es mayor que la que generan otros mecanismos de memoria virtual más básicos como el uso de la memoria de intercambio; cuando el núcleo escribe en una página, debe copiarla si esta está marcada como copy-on-write.

## Otras aplicaciones de copy-on-write

COW también se utiliza fuera del núcleo, como en bibliotecas de funciones, aplicaciones, e incluso en otras partes del sistema operativo. La clase string provista por la biblioteca estándar de C++, por ejemplo, fue diseñada específicamente para permitir implementaciones con copy-on-write. En este contexto, si existe código multihilo, COW puede convertirse en un obstáculo, ya que el marcado de objetos en diferentes hilos necesario para compartir la misma representación para todos los procesos que quieran acceder dichos objetos puede superar fácilmente los beneficios de este mecanismo.

El concepto de copy-on-write también es utilizado en software de virtualización/emulación como Bochs, QEMU, Linux-VServer y User-mode Linux para almacenamiento en un disco virtual. Esto permite una reducción importante en el espacio de disco cuando varias máquinas virtuales pueden utilizar la misma imagen de disco, así como un rendimiento mayor, ya que las lecturas de disco pueden almacenarse en memoria y servirse a las otras máquinas virtuales, sin necesidad de posteriores accesos.

Asimismo, el concepto copy-on-write se utiliza en el mantenimiento de instantáneas (snapshots) en servidores de bases de datos como Microsoft SQL Server 2005 o en el servicio Shadow Copy de Microsoft. Western Digital, por su parte, hace uso de esta técnica en medios que requieren wear levelling para alargar su vida útil o son del tipo Write Once Read Many.

