Чому для сучасного Linux розмір стека за замовчуванням настільки величезний - 8 МБ (навіть 10 у деяких дистрибутивах)


10

Наприклад, на OSX це навіть менше 512 к.

Чи є рекомендований розмір, маючи на увазі, що додаток не використовує рекурсії і не виділяє багато змінних стеків ?
Я знаю, що питання занадто широке і воно сильно залежить від використання, але все ж хотілося задати питання, тому що мені було цікаво, чи є якась прихована / внутрішня / системна причина за цим величезним числом.


Мені було цікаво, як я маю намір змінити розмір стека на 512 KiB у своєму додатку - це все ще звучить як величезна кількість для цього, але це набагато менше, ніж 8MiB - і призведе до значно зменшеної віртуальної пам'яті процесу, як я мають багато ниток (вводу / виводу).

Я також знаю, що це не дуже боляче, тут добре пояснено : Розмір стека за замовчуванням для pthreads


Використовуєте 32-бітний процесор? Процесори X86_64 пропонують віртуальний адресний простір до 128 терабайт (у просторі користувача), якого повинно вистачити для великої кількості стеків 8 Мб.
Йохан Мірен

@ JohanMyréen - ні, x64 це так. Це не велика справа, я просто цікавився, немає справжньої причини для цього (на даний момент).
Кирило Кіров

У 2019 і 8 МіБ багато пам’яті? Я не думаю, що так. Маючи великий розмір стека за замовчуванням, це дуже легко писати програми з рекурсією. Я був дуже здивований, дізнавшись, що розмір стека за замовчуванням у Windows становить лише 1 Мбіт!
oldherl

Відповіді:


15

Як вже говорили інші, і як згадується у посиланні, яке ви надаєте у своєму запитанні, наявність стека 8MiB нічого не зашкодить (крім використання адресного простору - у 64-бітній системі, що не має значення).

Linux дуже довго використовував стеки 8MiB; зміна була введена у версії 1.3.7 ядра в липні 1995 року. Тоді вона була представлена ​​як введення обмеження, раніше не було жодного:

Обмежте стек до якогось розумного за замовчуванням: root завжди може збільшити цей ліміт, якщо потрібно. 8MB здається розумним.

В Linux обмеження стека також впливає на розмір аргументів програми та оточення, які обмежені однією чвертю ліміту стека ; ядро виконує принаймні 32 сторінки для аргументів та середовища.

Для потоків, якщо обмеження стека ( RLIMIT_STACK) необмежене, pthread_createзастосовує власні обмеження до стеків нових потоків - а для більшості архітектур це менше 8 Мбіт.


1
Нічого собі, цікавого. Я думав, що це було нещодавно представлено. У мене близько 200 ниток (це ще одна довга тема, тому давайте просто проігноруємо її на даний момент) і topпоказує страшні результати VIRT. Хоча, викопавши трохи глибше, більшість цього віртуального адресного простору береться з арен на одну нитку (пам'ять), а не з розміру стека, тому зменшення розміру стека не зменшить різко віртуальну пам'ять. Мені було просто цікаво, чому 8MiB і чому так багато.
Кирило Кіров

"8 Мб" просто означає, що стек кожного потоку може зрости до 8 МБ, якщо потік вирішить його використовувати. Але фізична пам'ять не буде виділена, поки пам'ять не буде фактично використана. Якщо ваші 200 потоків використовують 512 КБ кожен, ви використовуєте 100 Мб фізичний баран, а не 1,6 ГБ.
Гунтрам Блом підтримує Моніку

Якщо ви не обміняєтесь, то стовпець RES topдає вам набагато кращу відповідь на те, «яку пам'ять використовує цей процес», ніж VIRT.
kbolino

1
@Guntram OP це добре знає, дивіться посилання у питанні.
Стівен Кітт

1

8 МБ - це віртуальний розмір стека. Помилка сторінки відбудеться, коли ваша програма намагатиметься використовувати більше стека, ніж це фізично призначено. Потім обробник помилок сторінки ядра призначить фізичну сторінку, і тоді ваша програма продовжить роботу.

Повне пояснення див. У https://unix.stackexchange.com/a/280865/21212 .

Таким чином, зменшення розміру стека не повинно впливати на зменшення фізичної пам'яті програми.


1
Я вже пов’язав цю відповідь у своєму питанні. Я також писав, що мені це відомо, але це насправді не відповідає на питання. Все одно дякую
Кирило Кіров

Я думаю, вам потрібно переглянути приміщення питання, і ця (не) відповідь вказує на те, чому. Віртуальна пам'ять - це не реальна пам'ять. Розмір стека може становити 800 МБ, і це не вплине на фактичне використання пам'яті, якщо тільки ваша програма не створила кадри стека більше 8 Мб.
kbolino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.