Например, на OSX это даже меньше, чем 512k.
Есть ли рекомендуемый размер, учитывая, что приложение не использует рекурсию и не выделяет много переменных стека ?
Я знаю, что вопрос слишком широкий и сильно зависит от использования, но все же хотел спросить, так как мне было интересно, есть ли какая-то скрытая / внутренняя / системная причина этого огромного числа.
Мне было интересно, так как я намерен изменить размер стека на 512 КиБ в моем приложении - это все равно звучит как огромное количество для этого, но это намного меньше, чем 8 МБ - и приведет к значительному уменьшению виртуальной памяти процесса, так как я есть много потоков (I / O).
Я также знаю, что это не очень больно, хорошо объяснил здесь : размер стека по умолчанию для pthreads
источник
Ответы:
Как уже говорили другие, и как упоминается в ссылке, которую вы предоставляете в своем вопросе, наличие стека 8 МБ ничего не повредит (кроме использования адресного пространства - в 64-битной системе это не имеет значения).
Linux использует стеки по 8 МБ в течение очень долгого времени; изменение было введено в версии ядра 1.3.7 в июле 1995 года. Тогда оно было представлено как вводящее ограничение, ранее его не было:
В Linux ограничение стека также влияет на размер программных аргументов и среды, которые ограничены одной четвертой предела стека ; ядро применяет минимум 32 страницы для аргументов и среды.
Для потоков, если лимит стека (
RLIMIT_STACK
) не ограничен,pthread_create
применяет свои собственные ограничения к стекам новых потоков - и на большинстве архитектур это меньше 8 МБ.источник
top
показывает страшные результаты VIRT. Хотя, копая немного глубже, большая часть этого виртуального адресного пространства берется из каждого потока (памяти), а не из размера стека, поэтому уменьшение размера стека не приведет к значительному сокращению виртуальной памяти. Мне было просто любопытно, почему 8MiB и почему так много.top
дает вам гораздо лучший ответ на вопрос «какую память использует этот процесс», чем VIRT.8 МБ - это виртуальный размер стека. Ошибка страницы произойдет, когда ваше приложение попытается использовать больше стека, чем физически выделено в данный момент. Затем обработчик ошибок страницы ядра выделит физическую страницу, а затем ваше приложение продолжит работу.
См. Https://unix.stackexchange.com/a/280865/21212 для полного объяснения.
Таким образом, уменьшение размера вашего стека не должно иметь никакого эффекта в уменьшении использования физической памяти вашего приложения.
источник