Я работаю над Linux для процессора ARM для кабельного модема. Существует инструмент, который я написал, который отправляет/штурмует настроенные UDP-пакеты с использованием сырых сокетов. Я формирую пакет с нуля, так что у нас есть возможность играть с различными параметрами. Этот инструмент предназначен в основном для стресс-тестирования маршрутизаторов.Оптимизация памяти для дочерних процессов
У меня на самом деле создано несколько интерфейсов. Каждый интерфейс получит IP-адреса, используя DHCP. Это делается для того, чтобы модем работал как оборудование виртуального клиентского помещения (vcpe).
Когда система появляется, я запускаю те процессы, которые требуются. Каждый процесс, который я запускаю, будет непрерывно отправлять пакеты. Таким образом, процесс 0 будет отправлять пакеты с использованием интерфейса 0 и т. Д. Каждый из этих процессов, которые отправляют пакеты, разрешает настройку (изменение параметров UDP и других параметров во время выполнения). Именно поэтому я решил иметь отдельные процессы.
Я запускаю эти процессы, используя fork и excec из процессов инициализации модема.
Проблема в том, что каждый процесс занимает много памяти. Запуск всего трех таких процессов приводит к сбою и перезагрузке системы.
Я попытался следующие:
Я всегда считал, что толкая больше кода для библиотек Shared поможет. Поэтому, когда я попытался переместить многие функции в общую библиотеку и сохранить минимальный код в процессах, это не имело никакого значения для моего удивления. Я также удалил все массивы и заставил их использовать кучу. Однако это не имело никакого значения. Это может быть потому, что процессы выполняются непрерывно, и не имеет значения, если это стек или куча? Я подозреваю, что процесс от I, где я называю вилку, огромен, и это является причиной тех процессов, которые я делаю результатом огромным. Я не знаю, как еще я мог бы пойти. скажем, процесс A огромен -> Я начинаю процесс B путем разветвления и исключения. B наследует область памяти A. Итак, теперь я делаю это -> A запускает C, который запускает inturn B также не поможет, поскольку C все еще наследует A ?. Я использовал vfork как альтернативу, которая тоже не помогла. Я действительно удивляюсь, почему.
Буду признателен, если кто-нибудь даст мне советы, которые помогут мне уменьшить память, используемую каждым независимым дочерним процессом.