Обнаружилась очень странная вещь (тестировали на FreeBSD 5.4 и Slackware 10, под win32 такого не наблюдается)
В программе создается большое (100-1000, не важно) кол-во потоков (pthread_create)
Внутри потоков память НЕ выделяется. т.е. они сразу завершаются после создания.
Используемая память, как показывают top/ps, при этом вырастает очень сильно (при 300 потоках — 100mb)
После завершения всех потоков эта память не освобождается.
При повторном создании тех же потоков — цифра опять остается такая же (иногда бывают небольшие колебания).
Пробовали линковать с разными потоковыми библиотеками — ситуация повторяется (только объем памяти немного разный бывает)
P.S. Это было замечено сначала на своем проекте (портированом из win32), потом на AOLServer (open-source вебсервер от AOL), потом написали специальный тест.
Здравствуйте, Аноним, Вы писали:
А>Что бы это могло быть ?
На каждый поток система выделяет память под стек.
Одна киевская фирма Developex предлагает претендентам написать маленький прокси-сервер, в котором не запускался бы отдельный поток для обработки запроса каждого клиента...
Здравствуйте, Аноним, Вы писали:
А>Обнаружилась очень странная вещь (тестировали на FreeBSD 5.4 и Slackware 10, под win32 такого не наблюдается)
А>В программе создается большое (100-1000, не важно) кол-во потоков (pthread_create) А>Внутри потоков память НЕ выделяется. т.е. они сразу завершаются после создания.
А>Используемая память, как показывают top/ps, при этом вырастает очень сильно (при 300 потоках — 100mb) А>После завершения всех потоков эта память не освобождается. А>При повторном создании тех же потоков — цифра опять остается такая же (иногда бывают небольшие колебания).
А>Пробовали линковать с разными потоковыми библиотеками — ситуация повторяется (только объем памяти немного разный бывает)
А>P.S. Это было замечено сначала на своем проекте (портированом из win32), потом на AOLServer (open-source вебсервер от AOL), потом написали специальный тест.
А>Что бы это могло быть ?
неужели потоковый стек?
и странно что оно не чистится, может ссылки на потоки остаются?
Здравствуйте, sakhnik, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>Что бы это могло быть ?
S>На каждый поток система выделяет память под стек. S>Одна киевская фирма Developex предлагает претендентам написать маленький прокси-сервер, в котором не запускался бы отдельный поток для обработки запроса каждого клиента...
И что? Разве после завершения потока эта память (под его стек) не освобождается? или может не сразу освобождается?
Еще уточню: при повторном создании этих потоков памяти остается СТОЛЬКО ЖЕ, т.е. она не прибавляется, а используется под новые потоки...
Здравствуйте, d-ash, Вы писали:
DA>Здравствуйте, ilnar, Вы писали:
I>>неужели потоковый стек? I>>и странно что оно не чистится, может ссылки на потоки остаются?
DA>Какие ссылки? pthread_t — остаются, конечно, но они не валидные уже. Но как это может быть связано с памятью..
в винде пока есть валидные ссылки (хендлы по ихнему), данные потока остаются
Здравствуйте, ilnar, Вы писали:
I>>>неужели потоковый стек? I>>>и странно что оно не чистится, может ссылки на потоки остаются?
DA>>Какие ссылки? pthread_t — остаются, конечно, но они не валидные уже. Но как это может быть связано с памятью..
I>в винде пока есть валидные ссылки (хендлы по ихнему), данные потока остаются
так в винде все нормально работает.
кроме того, я ж говорю pthread_t хэндлы уже должны быть не валидные, потому что поток завершился, причем не важно joinable он (с последующим pthread_join) или detached.
Здравствуйте, d-ash, Вы писали:
DA>Здравствуйте, ilnar, Вы писали:
I>>>>неужели потоковый стек? I>>>>и странно что оно не чистится, может ссылки на потоки остаются?
DA>>>Какие ссылки? pthread_t — остаются, конечно, но они не валидные уже. Но как это может быть связано с памятью..
I>>в винде пока есть валидные ссылки (хендлы по ихнему), данные потока остаются
DA>так в винде все нормально работает. DA>кроме того, я ж говорю pthread_t хэндлы уже должны быть не валидные, потому что поток завершился, причем не важно joinable он (с последующим pthread_join) или detached.
Здравствуйте, d-ash, Вы писали:
DA>Здравствуйте, ilnar, Вы писали:
I>>надо просто зайти и спросить у разработчика
DA>Я и есть разработчик DA>А в AOLServer просто случайно такую же особенность нашли..
Здравствуйте, execve, Вы писали:
E>Здравствуйте, Аноним, Вы писали:
А>>Обнаружилась очень странная вещь (тестировали на FreeBSD 5.4 и Slackware 10, под win32 такого не наблюдается)
E>Какая реализация потоков используется?
pthread
линковали и с libthr и с libr_c — тоже самое, но памяти чуть меньше отъедается.