alt=Dous procesos comparten tres páxinas; despois dunha escritura do segundo proceso só unha páxina queda duplicada.|miniatura|431x431px|Compartición inicial e separación dunha páxina modificada. As outras páxinas poden seguir compartidas sen alterar a independencia lóxica dos procesos. A copia na escritura, coñecida pola expresión inglesa copy-on-write e polas siglas COW ou CoW, é unha técnica de xestión de datos que permite compartir unha representación física entre varias copias lóxicas ata que unha delas precisa modificala. Nese momento créase unha representación independente da parte afectada e a modificación aplícase á nova copia. O obxectivo é evitar duplicacións que non resultan necesarias, mantendo a semántica de obxectos ou espazos separados.

O principio aplícase en distintos niveis: páxinas de memoria virtual, bloques dun sistema de ficheiros e estruturas administradas por bibliotecas. Un exemplo é a creación dun proceso mediante fork en Linux: o proceso fillo recibe un espazo de memoria loxicamente separado, pero as páxinas poden compartirse inicialmente e copiarse cando se escriben.

Compartir non significa que as modificacións deban propagarse entre as copias. Precisamente, o mecanismo procura conservar a súa independencia sen pagar toda a duplicación por adiantado. O aforro depende da proporción de datos que cambian e da unidade de copia, mentres que a primeira escritura pode asumir un custo adicional de asignación, copia e actualización de metadatos.

Principio de funcionamento Unha copia inmediata percorre os datos de orixe e crea outra representación física antes de que o destinatario a utilice. A copia na escritura substitúe ese traballo inicial pola creación ou actualización de referencias. Mentres todas as copias se limiten a ler, poden obter os mesmos valores dunha representación común. Antes dunha modificación que deba ser privada, o sistema separa a representación afectada e redirixe a referencia do escritor.

O mecanismo necesita coñecer se os datos están compartidos e interceptar as modificacións. Nun sistema operativo, a protección das páxinas pode provocar unha excepción ao intentar escribir. Nunha biblioteca, os métodos que modifican un obxecto poden comprobar un contador de referencias. Nun sistema de ficheiros, os mapas de bloques permiten asignar unha nova localización aos datos escritos. A mesma idea xeral non implica unha implementación idéntica.

A unidade de separación condiciona o custo. Se unha páxina de memoria contén miles de bytes, cambiar un deles pode requirir copiar a páxina enteira. Nunha estrutura compartida dunha biblioteca, unha modificación pequena pode separar un bloque que contén moitos elementos. Outros deseños comparten subestruturas e copian só o camiño necesario para representar a nova versión. A expresión COW describe a política de diferir a copia, non fixa a súa granularidade.

Memoria virtual

Desenvolvemento nos sistemas operativos O emprego de copias virtuais permite integrar a compartición de datos na arquitectura do sistema operativo. O traballo de Rashid e colaboradores sobre Mach, publicado como informe técnico en 1987, describiu unha xestión de memoria que separaba as estruturas independentes da máquina das operacións dependentes do hardware. Entre as capacidades do sistema figuraban a copia na escritura, a memoria compartida e os ficheiros mapeados. A separación pretendía facer portable o deseño entre uniprocesadores e multiprocesadores con mecanismos de memoria diferentes.

Este enfoque sitúa COW dentro dun problema máis amplo: conservar unha abstracción común de memoria aínda que cambien as táboas de tradución e as capacidades dos procesadores. A existencia dun mecanismo de protección no hardware non determina por si soa a política de compartición. O sistema operativo debe conectar esa protección coa identidade dos obxectos de memoria e coa semántica das operacións que ofrece ás aplicacións.

Enderezos e páxinas físicas A memoria virtual separa os enderezos que utiliza un programa das localizacións físicas onde están os datos. As estruturas de tradución permiten que dous procesos teñan enderezos virtuais propios que apunten temporalmente á mesma páxina física. As proteccións de acceso limitan as operacións permitidas e fan posible que o sistema operativo interveña cando se intenta unha escritura que require tratamento especial.

A independencia lóxica dos procesos non esixe que todas as súas páxinas sexan distintas en cada instante. Esixe que as operacións permitidas produzan os resultados previstos e non alteren indebidamente o estado privado doutro proceso. COW aproveita esta diferenza: comparte a lectura e pospón a separación ata o primeiro cambio. O programa pode observar a semántica dunha copia aínda que a representación física inicial sexa común.

Creación de procesos Ao crear un fillo mediante fork, Linux non necesita duplicar inmediatamente todo o contido das páxinas do pai. A descrición do espazo virtual e as táboas correspondentes teñen un custo, pero os datos poden permanecer compartidos. Isto é especialmente útil cando o fillo substitúe axiña a súa imaxe de programa: unha copia anticipada de grandes rexións que nunca chegaría a utilizar suporía traballo desperdiciado.

Unha implementación didáctica marca como non escribibles as páxinas compartidas que orixinalmente permitían escritura e conserva información de que se trata dun caso COW. Se o pai ou o fillo intenta modificalas, o sistema recoñece ese estado. Cómpre distinguir estas páxinas dunha rexión que nunca debía ser escribible: unha violación dunha protección real non debe converterse automaticamente nun permiso para escribir.

O feito de que a chamada inicial sexa barata non asegura que toda a vida do fillo o sexa. Se ambos os procesos modifican a maior parte das páxinas, a duplicación acaba ocorrendo de forma diferida. A contabilidade do custo debe incluír as excepcións, a asignación das novas páxinas e os accesos á memoria. COW é unha optimización dependente do patrón de uso, non unha eliminación universal do traballo de copiar.

Fallo de páxina por escritura Un fallo de páxina non significa necesariamente que sexa preciso ler do disco. No caso COW, pode producirse porque unha páxina presente está protexida fronte á escritura. O xestor de memoria asigna unha páxina nova, copia nela os datos pertinentes e actualiza a tradución do proceso que escribe. Despois pode retomar a instrución baixo a nova correspondencia. Se xa non hai outros usuarios da páxina orixinal, algúns casos poden resolverse sen duplicar o contido.

As táboas de páxinas e as cachés de tradución deben manter unha visión coherente da modificación. Unha tradución antiga que aínda permita escribir na páxina compartida violaría a independencia buscada. Así, a copia dos bytes é só unha parte do mecanismo: tamén importan as proteccións, os contadores, as invalidacións e a sincronización entre procesadores. Estas tarefas explican por que a primeira escritura pode ter unha latencia distinta das seguintes.

Mapeos privados e compartidos A chamada mmap permite crear mapeos con semánticas diferentes. Un mapeo privado, identificado en Linux por MAP_PRIVATE, fai que as modificacións non se propaguen ao ficheiro subxacente como o farían nun mapeo compartido. COW permite ofrecer esa privacidade sen duplicar de inmediato todos os datos do ficheiro. O comportamento exacto tamén depende das regras da interface, incluída a visibilidade de cambios externos posteriores ao mapeo.

Un mapeo compartido ten outro propósito: facer visibles determinadas modificacións a outros usuarios do mesmo respaldo. Confundir ambos os casos leva a interpretar mal o efecto de escribir nunha dirección. A palabra «compartida» pode referirse á páxina física ou á semántica pública dos cambios, e non son equivalentes. Dous mapeos privados poden compartir páxinas físicas mentres só len, sen converterse en memoria compartida de comunicación.

Sistemas de ficheiros

Clons de ficheiros Unha operación reflink crea unha nova referencia lóxica a datos almacenados en bloques compartidos. Os ficheiros teñen identidades propias, pero os seus contidos comúns non necesitan duplicarse inicialmente. Cando un deles cambia, o sistema pode separar os bloques afectados e conservar os restantes. Isto diferencia un clon COW dunha ligazón dura, na que varios nomes designan o mesmo ficheiro e as modificacións corresponden ao mesmo obxecto.

A interface Linux FICLONE, xunto con FICLONERANGE para intervalos, permite solicitar a clonación de datos cando o sistema de ficheiros a admite. A posibilidade de compartir depende de condicións como o sistema subxacente e os intervalos afectados. Un programa debe distinguir unha copia lóxica conseguida mediante compartición dunha copia de bytes convencional, especialmente cando interpreta o consumo de espazo ou o custo da operación.

Instantáneas miniatura|375x375px|Unha instantánea e a versión actual comparten os bloques que non cambian. O bloque antigo segue ocupado mentres exista unha referencia que o necesite. Unha instantánea conserva unha vista dun conxunto de datos nun momento determinado. Nun sistema que comparte bloques, pode crearse sen duplicar inmediatamente todo o contido. As modificacións posteriores escriben novas representacións e a instantánea continúa referindo as anteriores. O espazo adicional depende do que cambia e do tempo durante o que se conservan as versións antigas.

En OpenZFS, as instantáneas representan estados consistentes dos conxuntos de datos e os clons permiten crear derivados escribibles a partir delas. A relación entre clon e instantánea de orixe forma parte dos metadatos que administran as dependencias. Un clon pode comezar cun custo pequeno de datos novos, pero acumula espazo a medida que se separan bloques. A operación non promete que toda a súa existencia conserve o mesmo custo inicial.

Persistencia e recuperación Escribir bloques novos permite conservar os antigos ata que se establece unha nova referencia coherente. Porén, a tolerancia a fallos require un protocolo completo para actualizar datos e metadatos, ordenar escrituras e recuperar un estado válido. A simple decisión de copiar antes de modificar non especifica que ocorre se a máquina se interrompe entre dúas operacións. Os sistemas de ficheiros deben integrar o principio coa súa arquitectura transaccional.

Unha instantánea consistente do sistema de ficheiros tampouco proba que todas as aplicacións estean nun punto semántico ideal. Unha base de datos pode ter cambios pendentes en memoria ou precisar recuperar o seu rexistro ao abrir a copia. Hai que distinguir coherencia estrutural do almacenamento e coherencia da aplicación. O contrato dunha instantánea describe que escrituras completadas entran na vista, pero non pode adiviñar a intención dun programa externo.

Compartición en bibliotecas As bibliotecas poden implementar obxectos con semántica de valor mediante unha representación interna compartida. Ao asignar unha cadea ou un contedor a outro, increméntase a referencia ao bloque común; antes dunha modificación, a biblioteca separa os datos se continúan compartidos. O usuario observa obxectos independentes, mentres que a lectura e o paso de argumentos poden evitar duplicacións.

Qt denomina compartición implícita a esta organización en varias das súas clases. A técnica require que todas as vías de modificación respecten o mecanismo de separación. Os iteradores, as referencias directas e as operacións que expoñen memoria interna poden introducir regras especiais. Un contador de referencias correcto non basta se un acceso mutable evita a comprobación que debía preservar a independencia.