Создать новый тонкий процесс, вилку или нити? - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над небольшим проектом и ищу совет.

По сути, у меня есть основной процесс, который представляет собой сервер с различными динамически растущими структурами данных и некоторыми сокетами здесь и там.

В некоторых случаях мне нужно создавать процессы, которые выполняют небольшой цикл столько времени, сколько это необходимо (им не нужна структура данных, fd или сокет основного сервера). Важным требованием является то, что они должны быть: быстрыми, легкими и долговечными (даже если основной сервер убит).

fork: со временем я получаю долговечность, но копирование основного сервера означает копирование всех его структур данных, файловой системы и т. Д., Которые излишне отягощают новый процесс.

поток: легкий и быстрый, но не долговечный и, прежде всего, очень нестабильный (если поток по какой-либо причине генерирует ошибку, может заблокировать все).

Идеальной вещью будет магический системный вызов, который выполняет ex-novo-процесс, который имеет функцию в качестве точки входа, но я думаю, что ничего подобного нет.

У вас есть какой-нибудь совет для меня?

1 Ответ

0 голосов
/ 10 мая 2018

fork: со временем я получаю долговечность, но копирование основного сервера означает скопируйте все его структуры данных, fd и т. д. обрабатывать без необходимости.

Не так много, как вы думаете. Linux fork() уже давно реализован на страницах копирования при записи. Дочерний процесс будет иметь то же адресное пространство , что и родительский процесс, но у него не будет собственных копий страниц, которые ни один из процессов не изменяет. Более того, стоимость копирования измененных страниц амортизируется с течением времени. Начальная fork() довольно дешевая.

нить: легкая и быстрая, но не долговечная и, прежде всего, очень нестабильная (если поток по какой-то причине генерирует ошибку, может заблокировать все).

Учитывая этот анализ, потоки не являются реальным вариантом в конце концов. Долговечность и стабильность являются функциональными требованиями. Минимальный вес и в некоторой степени даже скорость являются вопросами эффективности. Первая категория превосходит последнюю почти каждый раз.

Идеальной вещью будет магический системный вызов, который выполняется ex novo процесс, который имеет функцию в качестве точки входа, но я думаю, что есть ничего подобного.

Поскольку вы ориентируетесь на Linux, рассматривали ли вы clone()? Это именно то, что вы описываете, хотя я сомневаюсь, что то, что вы сказали, полностью отражает семантику, которую вы представляете для такой функции.

В качестве альтернативы вы рассматривали fork + exec? Это, вероятно, потребует некоторого рефакторинга, но, выполняя exec, дочерний элемент будет отбрасывать контекст, совместно используемый со своим родителем, настолько, насколько это возможно, сразу после (дешевого) начального форка.

...