Привет всем! Кто-нибудь знает, где можно почитать про динамическое расширение стека? Чё-т не могу нагуглить толком. Есть какие-то обрывки с форумов, а так, чтоб обстоятельно и подробно – не нахожу. Вот здесь более или менее что-то нарыл: http://caslab.csl.yale.edu/workshops/hasp2016/HASP16-17.pdf (пп. 5.2, 6.3). Но здесь общие сведения о технологии, а не конкретные реализации в Windows/Linux. Интересуют подробности механизма именно в Windows и в Linux (как минимум знаю, что в Windows надо откусывать по 4 Кб, в Linux такого, как я понял, нет). Может ли стек "сжиматься" обратно при каких-либо обстоятельствах (мало ли)? И т.д.
Что-то размер подозрительно совпадает с размером страницы. А что значит "сжимается"? Граница секции двигается?
Механизм расширения стека довольно не прост, у меня к примеру недавно была та же задача - мониторить расшрение стека для апдейта карты памяти. Смотри реализацию в wrk: MiCheckForUserStackOverflow(). Используется несколько полей TEB, deallocation к примеру. Если не нужна какая то спец обработка, то трогать стек не нужно. А есчо стек проверяется защитой.
Логично То и значит. Было выделено 32 Кб, допустим, растянули до 1 Мб, дальше используется в пределах 32 Кб. Может ли освободиться память между 32 Кб и 1 Мб, т.е. вернуться в исходное состояние всё? Что значит не нужно трогать? Маркитанить я тут не собираюсь, просто хочу механизм понять.
Jin X, > Что значит не нужно трогать? Стек по умолчанию расширяется вниз при доступе к сторожевой его странице на одну страницу. Есть некоторые параметры, изменение которых изменит сам механизм, посмотрите выше в функции: Код (Text): RegionSize = (SIZE_T) Teb->GuaranteedStackBytes; ... if (RegionSize != 0) { RegionSize += PAGE_SIZE; MaximumAddress = (PVOID) ((PCHAR) DeallocationStack - PAGE_SIZE); } if (RegionSize < GUARD_PAGE_SIZE) { RegionSize = GUARD_PAGE_SIZE; } Стек расширяется так же при выборке из ядра в него. > Может ли освободиться память между 32 Кб и 1 Мб Не может. Есть в нт такое понятие как фиберы https://docs.microsoft.com/en-us/windows/desktop/procthread/fibers Каждый фибер имеет свой стек, он переключается при переключении на фибер. --- Сообщение объединено, 25 апр 2019 --- Кстате есть с фиберами один подводный камень". Удобно использовть вершину стека для хранения указателя на локальное хранилище, так как там свободное поле. Но если например вызвать диалог выбора файла, окажется что поле зануляется. На самом деле это переключается стек при использовании фиберов
Есть такая штука - резервирование памяти, по английски allocate. См VirtualAlloc Вы указываете сколько страниц вам надо. Но физически они не выделяются. Когла проц обращается к стеку срабатывает исключение защиты страниц. И виндоус выделяет страницу. Ах да расширение работает только для последовательного выделении памяти. В линуксе аналогично но там обработку исклучения надо делать ручками. Высвобождение может происходить. По таймеру в мониторе производительности сжатие страниц. Но неясно как оно работает.
Pavia, > Высвобождение может происходить. По таймеру в мониторе производительности сжатие страниц. Это теневая работа ядра ос. В нт тоже есть часть, которая выгружает рабочие наборы. Но про эти механизмы поток не знает и ему незачем.