На самом деле, размер вашего виртуального стека составляет 8388608 байт (8 МБ). Конечно, естественно сделать вывод, что это не может быть правильно, потому что это невероятно большой объем памяти для каждого потока, который он использует для своего стека, когда в 99% случаев пара КБ, вероятно, - все, что им нужно.
Хорошей новостью является то, что ваш поток использует только тот объем физической памяти, который ему действительно необходим. Это одна из магических возможностей, которые ваша ОС получает от использования аппаратного модуля управления памятью (MMU) в вашем процессоре. Вот что происходит:
Операционная система выделяет 8 МБ виртуальной памяти для вашего стека, настраивая таблицы страниц MMU для вашего потока. Это требует очень мало оперативной памяти для хранения только записей таблицы страниц.
Когда ваш поток запускается и пытается получить доступ к виртуальному адресу в стеке, которому еще не назначена физическая страница, MMU вызывает аппаратное исключение, называемое «сбой страницы».
Ядро ЦП реагирует на исключение ошибки страницы, переключаясь в привилегированный режим выполнения (который имеет свой собственный стек) и вызывая функцию обработчика исключения ошибки страницы внутри ядра.
Ядро выделяет страницу физической памяти этой странице виртуальной памяти и возвращает ее обратно потоку пользовательского пространства.
Поток пользовательского пространства не видит ничего из этой работы. С его точки зрения, он просто использует стек, как если бы память была там все время. Между тем, стек автоматически увеличивается (или не увеличивается) для удовлетворения потребностей потока.
MMU является ключевой частью аппаратного обеспечения современных компьютерных систем. В частности, он несет ответственность за большую часть «волшебства» в системе, поэтому я настоятельно рекомендую узнать больше о том, что делает MMU, и о виртуальной памяти в целом. Кроме того, если ваше приложение чувствительно к производительности и имеет дело со значительным объемом данных, вы должны понимать, как работает TLB (кеш таблицы страниц MMU) и как вы можете реструктурировать свои данные или свои алгоритмы, чтобы максимизировать частоту обращений к TLB.
8388608 / 1024 = 8192
.