Opened 2 hours ago
#814 new улучшение
Заменить fork()+execl() и popen() на posix_spawn()
| Reported by: | alx | Owned by: | alx |
|---|---|---|---|
| Priority: | средний | Milestone: | 2 очередь |
| Component: | sw | Keywords: | |
| Cc: |
Description
В настоящее время для запуска внешних процессов swd выполняет fork(), затем закрывает все файловые дескрипторы (кроме нужных для коммуникации) и затем выполняет execl().
Выполнение fork() - тяжелая операция, так как создается копия "тяжелого" процесса swd. Предлагается выполнять внешние процессы с помощью вызова posix_spawn(), который не дублирует память процесса, а блокирует родительский процесс до момента старта образа процесса-потомка. Экспериментально подтверждено, что в условиях значительного объема памяти, используемой родительским процессом, вызов posix_spawn() ведет себя лучше (работает даже когда fork() завершается с ошибкой). Вместо закрытия дескрипторов предлагается устанавливать им флаг CLOEXEC.
Аналогичным образом следует заменить вызовы popen(), также использующей fork().
