Это на самом деле вопрос из двух частей.
- Почему
posix_spawn()
быстрее, чем написано от руки fork()
+ exec()
, когда posix_spawn()
само по себе просто Обертка вокруг fork()
+ exec()
? - Почему
posix_spawn()
с POSIX_SPAWN_USEVFORK
медленнее, чем написано от руки vfork()
+ exec()
?
Согласно Ruby библиотека порождения posix работа кажется, что posix_spawn()
обеспечивает постоянную пропускную способность. Я прочитал исходный код glib c, но не смог найти ничего очевидного, что дает такую согласованность. Кто-нибудь может мне это объяснить?
Я сделал небольшой тестовый исходный файл (слишком большой для нас, GitHub), и он запускался примерно 30 раз - каждый раз вызывая /bin/true
несколько раз (случайное число между 1000-10000) - затем деление общего времени, затраченного на общее количество итераций. Результаты показаны ниже. Он работает на среднем Linux настольном компьютере Mint без наворотов.
Я полагаю, что справочная страница рассматривает vfork()
как архитектурный блеми sh, но для моего варианты использования, это просто отлично.
Здесь префикс v
использует vfork()
, а префикс n
является нормальным fork()
.