fork: со временем я получаю долговечность, но копирование основного сервера означает
скопируйте все его структуры данных, fd и т. д.
обрабатывать без необходимости.
Не так много, как вы думаете. Linux fork()
уже давно реализован на страницах копирования при записи. Дочерний процесс будет иметь то же адресное пространство , что и родительский процесс, но у него не будет собственных копий страниц, которые ни один из процессов не изменяет. Более того, стоимость копирования измененных страниц амортизируется с течением времени. Начальная fork()
довольно дешевая.
нить: легкая и быстрая, но не долговечная и, прежде всего, очень нестабильная (если
поток по какой-то причине генерирует ошибку, может заблокировать все).
Учитывая этот анализ, потоки не являются реальным вариантом в конце концов. Долговечность и стабильность являются функциональными требованиями. Минимальный вес и в некоторой степени даже скорость являются вопросами эффективности. Первая категория превосходит последнюю почти каждый раз.
Идеальной вещью будет магический системный вызов, который выполняется ex novo
процесс, который имеет функцию в качестве точки входа, но я думаю, что есть
ничего подобного.
Поскольку вы ориентируетесь на Linux, рассматривали ли вы clone()
? Это именно то, что вы описываете, хотя я сомневаюсь, что то, что вы сказали, полностью отражает семантику, которую вы представляете для такой функции.
В качестве альтернативы вы рассматривали fork + exec? Это, вероятно, потребует некоторого рефакторинга, но, выполняя exec, дочерний элемент будет отбрасывать контекст, совместно используемый со своим родителем, настолько, насколько это возможно, сразу после (дешевого) начального форка.