cópia na escrita

O copy-on-write ou copy-on-write (frequentemente referido por sua sigla COW ) é uma estratégia de otimização usada na programação de computadores . A ideia básica: se vários chamadores solicitarem recursos que são inicialmente indistinguíveis, você pode fornecer a eles ponteiros para o mesmo recurso. Essa ficção pode ser mantida até que um chamador mude sua "cópia" do recurso. Neste ponto, uma cópia privada é criada. Isso evita que a alteração seja visível em outro lugar. Isso acontece de forma transparente para os chamadores. A principal vantagem é que, se um chamador nunca fizer alterações, a cópia privada nunca será criada.

O principal uso do Copy-on-write é a memória virtual dos sistemas operacionais . Quando um processo cria uma cópia de si mesmo , as páginas na memória que devem ser modificadas pelo processo ou por sua cópia são marcadas como cópia na gravação. Quando os modifica processo de uma página de memória, as operacional intercepta kernel do sistema da operação e copia a página de memória de forma que as mudanças na memória para um processo não afetam o de outro.

Outro uso é a função calloc . Pode ser implementado com uma página RAM preenchida com zeros. Quando a memória é alocada, todas as páginas retornadas referem-se à página de zeros e são marcadas como cópia na gravação. Dessa forma, a quantidade de RAM alocada para o processo não aumenta até que os dados sejam gravados no buffer retornado pelo calloc. Normalmente, isso só é feito para grandes alocações de memória.

A cópia na gravação pode ser implementada informando à MMU que certas páginas no espaço de endereço do processo são somente leitura. Quando os dados são gravados nessas páginas, o MMU lança uma exceção que é tratada pelo kernel. Isso aloca RAM e faz com que a página escrita corresponda a este novo local na RAM.

O uso frugal da memória é uma grande vantagem do COW. Como o uso de RAM só aumenta quando os dados são armazenados, tabelas de hash muito eficientes podem ser implementadas. Eles dificilmente usam mais memória do que os objetos que contêm. No entanto, esses programas podem ficar sem espaço de memória virtual. As páginas virtuais não usadas pela tabela hash não podem ser usadas por outras partes do programa. O principal problema do COW no nível do kernel é a complexidade que ele adiciona, mas as preocupações são semelhantes às levantadas por problemas mais básicos de memória virtual, como paginação para o disco. Quando o kernel grava essas páginas, ele deve copiá-las como se estivessem marcadas como cópia na gravação.

O COW pode ser usado fora do kernel, em bibliotecas de software , aplicativo ou software de sistema. A classe stringfornecida pela C ++ Standard Template Library foi projetada para oferecer suporte a implementações COW. Um dos riscos do COW nesses contextos vem do código com vários processos leves, onde bloqueios adicionais são necessários para que objetos em diferentes processos leves compartilhem a mesma representação. A complexidade de implementação resultante pode anular os supostos benefícios da técnica COW.

Ilustração da técnica COW no C ++ STL

std::string x("Hello"); std::string y = x; // x et y utilisent le même tampon y += ", World!"; // maintenant y utilise un tampon différent // x continue à utiliser le même buffer


Softwares de virtualização / emulação como Bochs , QEMU ou UML usam COW para armazenamento em disco virtual. Isso permite uma grande redução no espaço em disco necessário quando várias máquinas virtuais são baseadas na mesma imagem de disco. Além disso, o desempenho é aprimorado porque as leituras do disco podem ser armazenadas em cache na RAM e as leituras subsequentes para outras máquinas virtuais podem ser atendidas do cache .

Veja também

links externos