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