Странное поведение в Linux для простой программы - PullRequest
1 голос
/ 17 декабря 2010

Мы написали очень простую программу на C ++, чтобы изолировать ошибку.Приложение принимает число в качестве аргумента, создает это количество потоков и отправляет все эти потоки в цикл обработки событий.Если мы запустим приложение с> 3-мя потоками (включая основной поток), top покажет, что оно занимает более 100 МБ в виртуальной памяти.Однако, если мы запустим его с потоками <= 3, он будет работать с виртуальной памятью около 36 МБ.Мы <code>strace запустили приложение и выяснили, что в первом сценарии есть mmap размером около 65 МБ, который отображается анонимно и не отображается.Проблема в том, что использование памяти увеличивается с увеличением количества потоков.И у нас есть большое количество двоичных файлов, которые имеют большое количество потоков, поэтому, похоже, много потерянного пространства.Почему это происходит?SLES11 64bit.

1 Ответ

5 голосов
/ 17 декабря 2010

Каждый поток по умолчанию получает стек около 8 МБ.Вы можете установить значение по умолчанию при создании потока с pthread_attr_setstacksize .Убедитесь, что вы всегда либо: pthread_join () 'завершив тем.Или же;создайте их как отдельные потоки, иначе вы потеряете память, когда поток закончится.

Большое использование виртуальной памяти обычно не является проблемой, хотя, если вы действительно не используете все это пространство, это просто виртуальная памятьи вам вряд ли хватит этого на 64-битной машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...