# Cópia em gravação

Cópia em gravação (em Inglês: Copy-on-write (CoW ou COW)), às vezes chamado de compartilhamento implícito ou sombreamento, é uma técnica de gestão de recursos usada na programação de computadores para implementar eficientemente uma operação "duplicar" ou "copiar" em recursos modificáveis. Se um recurso é duplicado, mas não modificado, não será necessário criar um novo recurso; o recurso pode ser compartilhado entre a cópia e o original. As modificações ainda devem criar uma cópia, daí a técnica: a operação de cópia é adiada para a primeira gravação. Ao compartilhar recursos dessa maneira, é possível reduzir significativamente o consumo de recursos de cópias não modificadas, ao mesmo tempo em que adiciona uma pequena sobrecarga às operações de modificação de recursos.

## Em gerenciamento de memória virtual

A cópia em gravação encontra seu uso principal no compartilhamento da memória virtual dos processos do sistema operacional, na implementação da chamada de sistema fork. Normalmente, o processo não modifica nenhuma memória e executa imediatamente um novo processo, substituindo totalmente o espaço de endereço. Assim, seria um desperdício copiar toda a memória do processo durante um fork e, em vez disso, a técnica de cópia em gravação é usada. Ele pode ser implementado de maneira eficiente usando a tabela de páginas ao marcar determinadas páginas de memória como somente leitura e mantendo uma contagem do número de referências à página. Quando os dados são gravados nessas páginas, o kernel intercepta a tentativa de gravação e aloca uma nova página física, inicializada com os dados de cópia em gravação, embora a alocação possa ser ignorada se houver apenas uma referência. O kernel então atualiza a tabela de páginas com a nova página (gravável), decrementa o número de referências e executa a gravação. A nova alocação garante que uma mudança na memória de um processo não seja visível em outro. A técnica de cópia em gravação pode ser estendida para oferecer suporte à alocação de memória eficiente, tendo uma página de memória física preenchida com zeros. Quando a memória é alocada, todas as páginas retornadas referem-se à página de zeros e são todas marcadas como cópia em gravação. Dessa forma, a memória física não é alocada para o processo até que os dados sejam gravados, permitindo que os processos reservem mais memória virtual do que a memória física e usem a memória de forma esparsa, correndo o risco de ficar sem espaço de endereço virtual. O algoritmo combinado é semelhante ao de paginação em demanda.
As páginas em cópia em gravação também são usadas no recurso de mesclagem de mesma página de kernel do kernel do Linux.

## Em armazenamento de computador

A cópia em gravação também pode ser usada como o mecanismo subjacente para capturas instantâneas, como aquelas fornecidas pelo gerenciamento de volume lógico, sistemas de arquivos como Btrfs e ZFS, e servidores de banco de dados, como o Microsoft SQL Server. Normalmente, os instantâneos armazenam apenas os dados modificados e são armazenados próximos ao array principal, portanto, eles são apenas uma forma fraca de backup incremental e não podem substituir um backup completo. Alguns sistemas também usam uma técnica de cópia em gravação para evitar os backups difusos, caso contrário, ocorre quando qualquer arquivo no conjunto de arquivos que estão sendo armazenados em backup muda durante esse backup.
Ao implementar instantâneos, existem duas técnicas:
* O armazenamento original nunca é modificado. (chamado "redirecionamento em gravação")
* Quando uma solicitação de gravação é feita, os dados são copiados para uma nova área de armazenamento e, em seguida, os dados originais são modificados. (chamado "cópia em gravação")
Apesar de seus nomes, cópia em gravação geralmente se refere à primeira técnica. A cópia em gravação faz duas gravações de dados, comparadas com uma gravação de dados feita pelo redirecionamento em gravação; é difícil de implementar de forma eficiente e, portanto, usado com pouca frequência.
A técnica de cópia em gravação pode ser usada para emular um armazenamento com leitura e gravação em mídias que exijam nivelamento de desgaste ou sejam fisicamente gravadas uma vez, lidas muitas vezes.
O formato de imagem de disco qcow2 (cópia em gravação do QEMU) usa a técnica de cópia em gravação para reduzir o tamanho da imagem do disco.
Alguns Live CDs (e Live USBs) usam técnicas de cópia em gravação para dar a impressão de poder adicionar e excluir arquivos em qualquer diretório, sem realmente fazer alterações no CD (ou na unidade flash USB).

## Em software de alta confiabilidade

O Phantom OS usa a cópia em gravação em todos os níveis, não só em um banco de dados ou em um sistema de arquivos. A qualquer momento, um computador que executa este sistema pode falhar e, quando ele é iniciado novamente, o software e o sistema operacional retomam a operação. Somente quantidades pequenas de trabalho podem ser perdidas.
A abordagem básica é que todos os dados do programa são mantidos na memória virtual. Depois de passar algum tempo, um resumo de todos os dados de software é gravado na memória virtual, formando um registro que rastreia o valor atual e a localização de cada valor.
Quando o computador falha, uma cópia recente do registro e de outros dados permanece segura no disco. Quando a operação é retomada, o software do sistema operacional lê o registro para restaurar cópias consistentes de todos os programas e dados.
Essa abordagem usa a cópia em gravação em todos os níveis de todos os softwares, inclusive nos aplicativos. Isso requer suporte dentro da linguagem de programação de aplicativo. Na prática, o Phantom OS so permite linguagens que geram bytecodes Java.