← На главную

pidfd позволит Linux реализовать нативный posix_spawn

06.06.2026 14:34 · hackernews

Скоро 55 лет, а Unix всё ещё использует fork() и exec() для запуска процессов. Это дорого: fork() копирует всю память родителя, чтобы тут же выбросить её при exec(). Для Linux это clone() и execve(), но суть та же. Инженер Li Chen предложил ускорить этот паттерн с помощью "spawn templates".

Идея в том, чтобы кешировать информацию о часто запускаемом бинарнике (например, Git) и использовать шаблон для быстрого старта. Новый системный вызов spawn_template_create() принимает файловый дескриптор или путь и возвращает fd-шаблона. Второй вызов, spawn_template_spawn(), берёт этот шаблон и структуру с аргументами (argv), окружением (envp) и действиями над файловыми дескрипторами (закрыть, продублировать, сменить директорию). Внутри ядро всё равно проходит нормальный путь fork/exec со всеми проверками безопасности, но за счёт закешированных данных процесс ускоряется.

Насколько? Бенчмарки автора показывают прирост около 2%. Скромно, но для некоторых сценариев имеет значение.

Патч получил детальную рецензию от Mateusz Guzik. Он сказал, что проблема ему близка, и назвал идиому fork + exec ужасной. Главный недостаток предложения — оно не трогает fork(), а именно там основные расходы. По его мнению, правильный путь — не копировать текущий процесс, а создавать «чистый» процесс с нуля.

Christian Brauner поддержал идею «builder API для exec», но предложил строить новый интерфейс поверх существующей абстракции pidfd. Он видит решение так: расширить pidfd_open(), чтобы он создавал пустой процесс, а затем настраивать его через новый системный вызов pidfd_config() (по аналогии с fsconfig()). Конечная цель — реализовать posix_spawn() в user space без скрытых fork() и exec() под капотом.

Li Chen согласился, что набросок Brauner выглядит лучше, и пообещал двигаться в этом направлении. Так что spawn templates в текущем виде в ядро не войдут. Но если работа продолжится, Linux наконец-то может получить полноценную нативную реализацию posix_spawn().

Читать оригинал →