Windows

Параметр cbStack


Этот параметр определяет, какую часть адресного пространства поток сможет исполь зовать под свой стек. Каждому потоку выделяется отдельный стек Функция Create Process, запуская приложение, вызывает CreateThread, и та инициализирует первич ный поток процесса При этом CreateProcess заносит в параметр cbStack значение, хранящееся в самом исполняемом файле Управлять этим значением позволяет ключ /STACK компоновщика:

/STACK.[reserve] [,commit]

Аргумент reserve определяет объем адресного пространства, который система должна зарезервировать под стек потока (по умолчанию — 1 Мб). Аргумент commit задает объем физической памяти, который изначально передается области, зарезер вированной под стек (по умолчанию — 1 страница). По мере исполнения кода в по токе Вам, весьма вероятно, понадобится отвести под стек больше одной страницы памяти. При переполнении стека возникнет исключение (О стеке потока и исключе ниях, связанных с его переполнением, см. главу 16, а об общих принципах обработ ки исключений — главу 23.) Перехватив это исключение, система передаст зарезер вированному пространству еще одну страницу (или столько, сколько указано в аргу менте commit) Такой механизм позволяет динамически увеличивать размер стека лишь по необходимости.

Если Вы, обращаясь к CreateThread, передаете в параметре cbStack ненулевое зна чение, функция резервирует всю указанную Вами память. Ее объем определяется либо значением параметра cbStack, либо значением, заданным в ключе /STACK компонов щика (выбирается большее из них). Но передается стеку лишь тот объем памяти, ко торый соответствует значению в cbStack Если же Вы передаете в параметре cbStack нулевое значение, CreateThread создает стск для нового потока, используя информа цию, встроенную компоновщиком в ЕХЕ-файл

Значение аргумента reserve устанавливает верхний предел для стека, и это огра ничение позволяет прекращать деятельность функций с бесконечной рекурсией. До пустим, Вы пишете функцию, которая рекурсивно вызывает сама себя Предположим также, что в функции есть "жучок», приводящий к бесконечной рекурсии. Всякий раз, когда функция вызывает сама себя, в стске создается новый стековый фрейм. Если бы система не позволяла ограничивать максимальный размер стека, рекурсивная функ ция так и вызывала бы сама себя до бесконечности, а стек поглотил бы все адресное пространство процесса. Задавая же определенный предел, Вы, во-первых, предотвра щаете разрастание стека до гигантских объемов и, во-вторых, гораздо быстрее узна ете о наличии ошибки в своей программе. (Программа-пример Summation в главе 16 продемонстрирует, как перехватывать и обрабатывать переполнение стека в прило жениях )



Содержание раздела