Почему posix_spawn быстрее, когда это просто оболочка вокруг fork + exe c? - PullRequest
0 голосов
/ 12 марта 2020

Это на самом деле вопрос из двух частей.

  1. Почему posix_spawn() быстрее, чем написано от руки fork() + exec(), когда posix_spawn() само по себе просто Обертка вокруг fork() + exec()?
  2. Почему posix_spawn() с POSIX_SPAWN_USEVFORK медленнее, чем написано от руки vfork() + exec()?

Согласно Ruby библиотека порождения posix работа кажется, что posix_spawn() обеспечивает постоянную пропускную способность. Я прочитал исходный код glib c, но не смог найти ничего очевидного, что дает такую ​​согласованность. Кто-нибудь может мне это объяснить?

Я сделал небольшой тестовый исходный файл (слишком большой для нас, GitHub), и он запускался примерно 30 раз - каждый раз вызывая /bin/true несколько раз (случайное число между 1000-10000) - затем деление общего времени, затраченного на общее количество итераций. Результаты показаны ниже. Он работает на среднем Linux настольном компьютере Mint без наворотов.

Я полагаю, что справочная страница рассматривает vfork() как архитектурный блеми sh, но для моего варианты использования, это просто отлично.

Graph of various forking mechanisms

Здесь префикс v использует vfork(), а префикс n является нормальным fork().

...