Вы в основном не избежать fork(2) (или эквивалентный clone(2) ... системный вызов, или устаревшую vfork
, которые я не рекомендую использовать) + execve(2) начать внешнюю команду (а-ля system(3) или а-ля posix_spawn) на Linux и (возможно) MacOSX и большинство других систем Unix или POSIX.
Почему вы считаете, что это проблема? И виртуальное адресное пространство процесса 8GB сегодня не имеет большого значения (по крайней мере, на машинах с 8 Гбайт или 16 Гбайт оперативной памяти, как у моего рабочего стола). Вам не требуется в два раза больше оперативной памяти (но вам нужно место подкачки) благодаря ленивым методам copy-on-write, используемым всеми последними Linux-файлами Unixes &.
Возможно, вы можете поверить, что пространство подкачки может быть проблемой. В Linux вы можете добавить пространство подкачки, возможно, путем замены на файл; просто запустить как корень:
dd if=/dev/zero of=/var/tmp/myswap bs=1M count=32768
mkswap /var/tmp/myswap
swapon /var/tmp/myswap
(конечно, убедитесь, что /var/tmp/
не TMPFS установлена файловая система, но сидит на каком-то диске, возможно, SSD один ....)
Когда вы надеваете» нужно больше места для подкачки, запустите swapoff /var/tmp/myswap
....
Вы также можете запустить какой-то внешний процесс оболочки в начале вашей программы (à la popen
), а позже вы можете отправить команды оболочки на него. Посмотрите на моей программе execicar.c для вдохновения, или использовать его, если он подходит (я написал 10 лет назад для подобных целей, но я забыл подробность)
Альтернативно вилка в начале вашей программы некоторых интерпретатор (Lua, Guile. ..) и отправить некоторые команды ему.
Запуск больше, чем несколько десятков команд в секунду (начиная с любой внешней программой) не является разумным, и их следует рассматривать как дизайн ошибку, ИМХО. Возможно, команды, которые вы используете, могут быть заменены встроенными функциями (например, /bin/ls
могут быть выполнены с stat
, readdir
, glob
функциями ...). Возможно, вы можете подумать о , добавив (с dlopen(3) ) к вашему коду (и запускать функции из плагинов, а не запускать очень часто одни и те же программы). Или, возможно, встройте в свой код переводчика (Lua, Guile, ...).
В качестве примера, для веб-серверов, найдите старые CGI vs FastCGI или HTTP-пересылку (например,URL redirection) или встроенный PHP или HOP или Ocsigen
Вы не указали ОС, но в Linux fork() использует copy-on-write, поэтому я не ожидаю проблемы с производительностью. –
Если вы хотите избежать копирования родительской памяти, возможно, 'vfork' может помочь. – phoxis
Трудно поверить, что 60% вашего времени потрачено на развилку. Сколько вилок вы делаете в секунду? – Marian