Установка размера стека по умолчанию в Linux для программы глобально - PullRequest
4 голосов
/ 17 июня 2010

Итак, я заметил, что размер стека по умолчанию для потоков в linux составляет 8 МБ (если я ошибаюсь, ПОЖАЛУЙСТА, поправьте меня), и, кстати, 1 МБ в Windows.Это довольно плохо для моего приложения, так как на 4-ядерном процессоре это означает, что 64 МБ места используется просто для потоков!Хуже всего то, что я никогда не использую более 100 Кбайт стека на поток (я злоупотребляю кучей LOT;)).

Мое решение сейчас - ограничить размер стека потоков.Тем не менее, я понятия не имею, как это сделать переносимо.Просто для контекста, я использую Boost.Thread для своих нужд.Я в порядке с небольшим количеством ада #ifdef, но я хотел бы сначала узнать, как это легко сделать.

В принципе, я хочу что-то вроде этого (где windows_ * связана в сборках Windowsи posix_ * связан в сборках Linux)

// windows_stack_limiter.c
int limit_stack_size()
{
    // Windows impl.
    return 0;
}

// posix_stack_limiter.c
int limit_stack_size()
{
    // Linux impl.
    return 0;
}

// stack_limiter.cpp
int limit_stack_size();
static volatile int placeholder = limit_stack_size();

Как мне реализовать эти функции?Или, наоборот, я делаю это совершенно неправильно?Помните, что я не могу контролировать фактическое создание потока (нет новых параметров для CreateThread в Windows), так как я использую Boost.Thread.

Ответы [ 3 ]

6 голосов
/ 17 июня 2010

Вам не нужно этого делать.Физическая память машины используется только там, где она необходима системе сбоев страниц запроса.Даже если стеки потоков значительно превышают объем используемого вами дополнительного размера в виртуальном адресном пространстве и не связывают физическое ОЗУ.

Если бы физическое ОЗУ было связано с такой скоростью, типичный компьютерНедостаточно памяти, если запущено всего несколько десятков процессов.Из ps -Al видно, что одновременно выполняется несколько больше.

1 голос
/ 06 мая 2015

Я сталкивался с подобными проблемами на 32-битных системах (особенно MIPS), в которых выполняются большие прикладные программы с сотнями потоков.Большие стеки по умолчанию не связывают физическую память, но виртуальная память также может быть дефицитным ресурсом.Есть несколько способов решить проблему:

  • Использовать setrlimit из программы.Я этого не делал, но подозреваю, что это сработает.
  • Перед запуском программы из оболочки используйте "ulimit -s" с параметром, меньшим, чем по умолчанию.(например, «ulimit -s 1024» для стека по умолчанию 1 МБ)
0 голосов
/ 17 июня 2010

Во-первых, вам не нужно менять это, если вы не получаете SEGV от достижения этого предела.(см. man setrlimit для подробной информации)

Во-вторых, вы меняете это во всех известных мне дистрибутивах linux, редактируя /etc/security/limits.conf (чтобы изменить значение по умолчанию) или запуская ulimit -s <stack size in kilobytes> для изменениязначение до выхода из оболочки.

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