«Как складываются стеки?» - динамически распределяется API CreateThread () (или как его там), вызываемого из загрузчика ОС для основного потока, а затем основным потоком и другими для создания дополнительных потоков.
'Как мы узнаем, сколько места понадобится нити?' - в настольных системах / ОС с большими пространствами виртуальной памяти компиляторы / компоновщики обычно задают большой максимальный размер (например, 1 МБ) для стека основного потока. Это значение сохраняется в заголовке исполняемого файла и используется ОС для резервирования 1 МБ или любого другого виртуального адресного пространства при загрузке исполняемого файла. ОС запускает на физическую память / подкачку намного меньший минимальный стек при запуске основного или другого потока.
'Что если поток использует пространство стека, которое было выделено?' - если поток использует свой принятый стек, генерируется прерывание из-за ошибки страницы, и, если зарезервированный предел стека не достигнут, увеличивается объем ОЗУ для расширения стека Если лимит достигнут, небольшой «овердрафт» из одной или двух страниц фиксируется и возникает исключение в вызывающей нить теме.
'адрес возврата прерванного потока. Что именно это обратный адрес? ПК достаточно, чтобы сообщить нам, какая инструкция будет выполнена в следующий раз, так какой смысл использовать этот обратный адрес? Как правило, ПК явно не сохраняется. Адрес возврата сохраняется в стеке с помощью механизма аппаратного / программного прерывания, который сгенерировал ввод кода ОС из кода пользовательского приложения. Таким образом, сохранение указателя стека эффективно сохраняет ПК (и часто также кучу регистров и т. Д., Прежде чем будет сделан переход к стеку ОС для реализации прерывания / системного вызова).