Что такое Copy-on-write (CoW)?

«Что такое Copy-on-write (CoW)?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Copy-on-write (CoW, копирование при записи) — это стратегия оптимизации ресурсов, при которой несколько процессов изначально совместно используют одни и те же данные (страницы памяти, блоки диска). Фактическое копирование данных происходит только тогда, когда один из процессов пытается изменить эти общие данные.

Классический пример в Linux: системный вызов fork().

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    int data = 42;
    pid_t pid = fork(); // Здесь происходит CoW для страниц памяти процесса

    if (pid == 0) {
        // Дочерний процесс
        printf("Child: data = %dn", data); // Чтение — данные общие
        data = 100; // Попытка записи — здесь ядро создает копию страницы памяти для дочернего процесса
        printf("Child after write: data = %dn", data);
    } else {
        // Родительский процесс
        wait(NULL);
        printf("Parent: data is still %dn", data); // Родительская копия не изменилась
    }
    return 0;
}

Применение в DevOps и контейнеризации:

  1. Docker/OCI образы: Слои образов используют CoW. Контейнер запускается из общего read-only образа, а его writable слой (R/W) создается только при записи файлов. Это экономит дисковое пространство и ускоряет запуск.
    # Два контейнера из одного образа Ubuntu делят базовые слои
    $ docker run -it ubuntu:22.04 bash
    $ docker run -it ubuntu:22.04 bash
  2. Файловые системы: Btrfs, ZFS, OverlayFS используют CoW для снапшотов и эффективного хранения данных.
  3. Виртуализация: Гипервизоры используют CoW для быстрого создания клонов виртуальных машин.

Преимущества: Значительная экономия памяти/дискового пространства и ускорение операций создания процессов/контейнеров. Недостаток: Небольшие накладные расходы на первое обращение на запись (копирование) и возможная фрагментация.