Насправді ваш розмір віртуальної стеки - 8388608 байт (8 МБ). Звичайно, природно зробити висновок, що це не може бути правильним, оскільки це смішно великий об'єм пам'яті, яку кожен потік витрачає на її стек, коли 99% часу, що становить пару КБ, ймовірно, все, що їм потрібно.
Хороша новина полягає в тому, що ваш потік використовує лише кількість фізичної пам'яті, яка йому фактично потрібна. Це одна з магічних сил, яку ваша ОС отримує від використання апаратного блоку управління пам’яттю (MMU) у вашому процесорі. Ось що відбувається:
ОС виділяє для вашого стека 8 Мб віртуальної пам’яті, встановивши таблиці сторінок MMU для вашого потоку. Для цього потрібно дуже мало оперативної пам’яті, щоб містити лише записи таблиці сторінок.
Коли ваш потік запускається і намагається отримати доступ до віртуальної адреси стека, у якого ще не призначена фізична сторінка, MMU запускає апаратне виключення під назвою "помилка сторінки".
Ядро ЦП реагує на виняток помилок сторінки шляхом переходу в режим привілейованого виконання (який має власний стек) і викликає функцію обробника винятків помилок сторінки всередині ядра.
Ядро виділяє сторінку фізичної оперативної пам’яті цій сторінці віртуальної пам’яті і повертається назад до потоку користувальницького простору.
Нитка простору користувача не бачить жодної роботи. З його точки зору, він просто використовує стек так, ніби пам'ять була там весь час. Тим часом стек автоматично зростає (або ні) для задоволення потреб потоку.
MMU є ключовою частиною апаратних засобів сучасних комп'ютерних систем. Зокрема, він відповідає за багато "магії" в системі, тому настійно рекомендую дізнатися більше про те, що робить MMU, і про віртуальну пам'ять загалом. Крім того, якщо ваша програма чутлива до продуктивності та має значну кількість даних, ви повинні зрозуміти, як працює TLB (кеш-таблиця сторінок MMU) та як ви можете реструктурувати свої дані або свої алгоритми, щоб досягти максимальної швидкості звернення TLB.
8388608 / 1024 = 8192
.