Я создал клиент-серверную программу на Perl, используя IO :: Socket :: INET. Я получаю доступ к серверу через сайт на основе CGI. Моя серверная программа будет работать как демон и будет принимать несколько одновременных подключений. Мой серверный процесс занимает около 100 МБ памяти (9 больших массивов, много массивов ...). Я хочу, чтобы эти хеши находились в памяти и обменивались ими, чтобы мне не приходилось создавать их для каждого соединения. Создание хэша занимает 10-15 секунд.
Всякий раз, когда новое соединение принимается через сокеты, я запускаю новый процесс, чтобы позаботиться об обработке каждого полученного соединения. Поскольку родительский процесс огромен, каждый раз, когда я выполняю разветвление, процессор пытается выделить память новому дочернему элементу, но из-за ограниченности памяти порождает новый дочерний процесс, тем самым увеличивая время отклика. Много раз он зависает даже для одного соединения.
Родительский процесс создает 9 больших хешей. Для каждого ребенка мне нужно сослаться на один или несколько хэшей в режиме только для чтения. Я не буду обновлять хеши через ребенка. Я хочу использовать что-то вроде копирования при записи, с помощью которого я могу поделиться целыми 100 МБ или целыми глобальными переменными, созданными родителем, со всеми дочерними элементами? или любой другой механизм, такой как темы. Я ожидаю, что сервер получит минимум 100 запросов в секунду, и он сможет обрабатывать их все параллельно. В среднем ребенок выходит через 2 секунды.
Я использую Cygwin в Windows XP только с 1 ГБ ОЗУ. Я не нахожу способа преодолеть эту проблему. Можете ли вы предложить что-то? Как я могу делиться переменными, а также создавать 100 дочерних процессов в секунду, управлять ими и синхронизировать их,
Спасибо.