Copy-on-write ( COW ), a veces denominado uso compartido implícito [1] o sombreado , [2] es una técnica de gestión de recursos utilizada en programación informática para implementar eficientemente una operación de "duplicar" o "copiar" en recursos modificables. [3]Si un recurso está duplicado pero no modificado, no es necesario crear un nuevo recurso; el recurso se puede compartir entre la copia y el original. Las modificaciones aún deben crear una copia, de ahí la técnica: la operación de copia se aplaza hasta la primera escritura. Al compartir recursos de esta manera, es posible reducir significativamente el consumo de recursos de las copias no modificadas, mientras se agrega una pequeña sobrecarga a las operaciones de modificación de recursos.
En la gestión de la memoria virtual
Copy-on-write encuentra su uso principal al compartir la memoria virtual de los procesos del sistema operativo , en la implementación de la llamada al sistema fork . Por lo general, el proceso no modifica ninguna memoria e inmediatamente ejecuta un nuevo proceso, reemplazando el espacio de direcciones por completo. Por lo tanto, sería un desperdicio copiar toda la memoria del proceso durante una bifurcación y, en su lugar, se utiliza la técnica de copia en escritura.
La copia en escritura se puede implementar de manera eficiente utilizando la tabla de páginas marcando ciertas páginas de la memoria como de solo lectura y manteniendo un recuento del número de referencias a la página. Cuando se escriben datos en estas páginas, el kernel intercepta el intento de escritura y asigna una nueva página física, inicializada con los datos de copia en escritura, aunque la asignación se puede omitir si solo hay una referencia. A continuación, el núcleo actualiza la tabla de páginas con la nueva página (que se puede escribir), reduce el número de referencias y realiza la escritura. La nueva asignación asegura que un cambio en la memoria de un proceso no sea visible en otro.
La técnica de copia en escritura se puede ampliar para admitir una asignación de memoria eficiente al tener una página de memoria física llena de ceros. Cuando se asigna la memoria, todas las páginas devueltas se refieren a la página de ceros y todas se marcan como copia en escritura. De esta manera, la memoria física no se asigna para el proceso hasta que se escriben los datos, lo que permite que los procesos reserven más memoria virtual que la memoria física y utilicen la memoria escasamente, con el riesgo de quedarse sin espacio de direcciones virtuales. El algoritmo combinado es similar a la paginación por demanda . [3]
Copia en escritura también se utilizan páginas en el núcleo de Linux 's núcleo del mismo página fusión característica. [4]
La carga de las bibliotecas para una aplicación también es un uso de la técnica de copia en escritura. El enlazador dinámico asigna bibliotecas como privadas como sigue. Cualquier acción de escritura en las bibliotecas activará un COW en la gestión de la memoria virtual.
openat ( AT_FDCWD , "/lib64/libc.so.6" , O_RDONLY | O_CLOEXEC ) = 3 mmap ( NULL , 3.906.144 , PROT_READ | PROT_EXEC , MAP_PRIVATE | MAP_DENYWRITE , 3 , 0 ) mmap ( 0x7f8a3ced4000 , 24576 , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE , 3 , 0x1b0000 )
En software
COW también se usa en códigos de bibliotecas , aplicaciones y sistemas .
En los sistemas multiproceso , COW se puede implementar sin el uso del bloqueo tradicional y, en su lugar, usar comparar e intercambiar para incrementar o disminuir el contador de referencia interno. Dado que el recurso original nunca se modificará, varios subprocesos pueden copiarlo de forma segura (después de que se aumentó el recuento de referencias) sin la necesidad de un bloqueo costoso para el rendimiento, como las exclusiones mutuas . Si el contador de referencia se vuelve 0, entonces, por definición, solo 1 subproceso tenía una referencia, por lo que el recurso se puede desasignar de la memoria de manera segura, nuevamente sin el uso de mecanismos de bloqueo costosos para el rendimiento. El beneficio de no tener que copiar el recurso (y la ganancia de rendimiento resultante sobre la copia profunda tradicional) será, por lo tanto, válido tanto en sistemas de un solo subproceso como de múltiples subprocesos.
Ejemplos de
La clase de cadena proporcionada por la biblioteca estándar C ++ fue diseñada específicamente para permitir implementaciones de copia en escritura en el estándar C ++ 98 inicial, [5] pero no en el estándar C ++ 11 más nuevo: [6]
std :: string x ( "Hola" );std :: cadena y = x ; // xey usan el mismo búfery + = ", ¡Mundo!" ; // ahora y usa un búfer diferente // x todavía usa el mismo búfer anterior
En el lenguaje de programación PHP , todos los tipos, excepto las referencias, se implementan como copia en escritura. Por ejemplo, las cadenas y las matrices se pasan por referencia, pero cuando se modifican, se duplican si tienen recuentos de referencia distintos de cero. Esto les permite actuar como tipos de valor sin los problemas de rendimiento de copiar en una asignación o hacerlos inmutables. [7]
En el marco de Qt , muchos tipos son de copia en escritura ("implícitamente compartidos" en términos de Qt). Qt utiliza operaciones atómicas de comparación e intercambio para incrementar o disminuir el contador de referencia interno. Dado que las copias son baratas, los tipos Qt a menudo pueden ser utilizados de forma segura por varios subprocesos sin la necesidad de mecanismos de bloqueo como mutex . Por tanto, los beneficios de COW son válidos tanto en sistemas de un solo hilo como en sistemas multiproceso. [8]
En el almacenamiento de la computadora
COW también se puede utilizar como mecanismo subyacente para instantáneas , como las proporcionadas por la gestión de volúmenes lógicos , sistemas de archivos como Btrfs y ZFS , [9] y servidores de bases de datos como Microsoft SQL Server . Por lo general, las instantáneas almacenan solo los datos modificados y se almacenan cerca de la matriz principal, por lo que son solo una forma débil de copia de seguridad incremental y no pueden sustituir a una copia de seguridad completa . [10] Algunos sistemas también utilizan una técnica COW para evitar las copias de seguridad borrosas , que de otro modo se producen cuando cualquier archivo en el conjunto de archivos de los que se realiza la copia de seguridad cambia durante esa copia de seguridad.
Al implementar instantáneas, existen dos técnicas:
- Redirect-on-write o ROW: el almacenamiento original nunca se modifica. Cuando se realiza una solicitud de escritura, se redirige de los datos originales a una nueva área de almacenamiento.
- Copia en escritura o COW: cuando se realiza una solicitud de escritura, los datos se copian en una nueva área de almacenamiento y luego se modifican los datos originales.
A pesar de sus nombres, el copy-on-write generalmente se refiere a la primera técnica. COW realiza dos escrituras de datos en comparación con la de ROW; es difícil de implementar de manera eficiente y, por lo tanto, se usa con poca frecuencia.
La técnica de copia en escritura se puede utilizar para emular un almacenamiento de lectura y escritura en medios que requieren nivelación de desgaste o que se escriben físicamente una vez leídos .
El formato de imagen de disco qcow2 (copia en escritura de QEMU) utiliza la técnica de copia en escritura para reducir el tamaño de la imagen de disco.
Algunos CD en vivo (y USB en vivo ) utilizan técnicas de copia en escritura para dar la impresión de poder agregar y eliminar archivos en cualquier directorio, sin realizar ningún cambio en el CD (o unidad flash USB).
En software de alta confiabilidad
Phantom OS utiliza COW en todos los niveles, no solo en una base de datos o un sistema de archivos. En cualquier momento, una computadora que ejecuta este sistema puede fallar y luego, cuando se inicia de nuevo, el software y el sistema operativo reanudan su funcionamiento. Solo se pueden perder pequeñas cantidades de trabajo.
El enfoque básico es que todos los datos del programa se guarden en la memoria virtual. En algún horario, se escribe un resumen de todos los datos del software en la memoria virtual, formando un registro que rastrea el valor actual y la ubicación de cada valor.
Cuando la computadora falla, una copia reciente del registro y otros datos permanecen seguros en el disco. Cuando se reanuda la operación, el software del sistema operativo lee el registro para restaurar copias consistentes de todos los programas y datos.
Este enfoque utiliza la copia en escritura en todos los niveles en todo el software, incluido el software de aplicación. Esto requiere soporte dentro del lenguaje de programación de la aplicación. En la práctica, Phantom OS solo permite lenguajes que generan código de bytes Java .
Ver también
- Asignar al ras
- Btrfs
- Paginación de demanda
- Dirty COW : una vulnerabilidad de seguridad informática para el kernel del sistema operativo Linux
- Patrón de peso mosca
- Gestión de la memoria
- Estructura de datos persistente
- ReFS
- Instantánea (almacenamiento de computadora)
- Memoria virtual
Referencias
- ^ "Uso compartido implícito" . Proyecto Qt . Consultado el 4 de agosto de 2016 .
- ^ Rodeh, Ohad (1 de febrero de 2008). "Árboles B, sombreado y clones" (PDF) . Transacciones ACM sobre almacenamiento . 3 (4): 1. CiteSeerX 10.1.1.161.6863 . doi : 10.1145 / 1326542.1326544 . S2CID 207166167 . Consultado el 4 de agosto de 2016 .
- ^ a b Bovet, Daniel Pierre; Cesati, Marco (1 de enero de 2002). Comprensión del kernel de Linux . O'Reilly Media. pag. 295. ISBN 9780596002138.
- ^ Abbas, Ali. "El proceso de fusión de la misma página del núcleo" . alouche.net . Archivado desde el original el 8 de agosto de 2016 . Consultado el 4 de agosto de 2016 .
- ^ Meyers, Scott (2012), STL eficaz , Addison-Wesley, págs. 64–65, ISBN 9780132979184
- ^ "Modificaciones de concurrencia a la cadena básica" . Estándares abiertos . Consultado el 13 de febrero de 2015 .
- ^ Pauli, Julien; Ferrara, Anthony; Popov, Nikita (2013). "Gestión de la memoria" . www.phpinternalsbook.com . Libro de aspectos internos de PHP . Consultado el 4 de agosto de 2016 .
- ^ "Hilos y clases compartidas implícitamente" . Proyecto Qt . Consultado el 4 de agosto de 2016 .
- ^ Kasampalis, Sakis (2010). "Análisis e implementación del rendimiento de sistemas de archivos basados en copia en escritura" (PDF) . pag. 19 . Consultado el 11 de enero de 2013 .
- ^ Chien, Tim. "Las instantáneas NO son copias de seguridad" . www.oracle.com . Oracle . Consultado el 4 de agosto de 2016 .