В случае DOS при компиляции программ нужно было включать дополнительный программный код для конроля размера стека. В Windows 95, 98, NT этой проблемы нет, но возникает проблема контроля за выделением страниц физической памяти. Например,
VOID SomeFunc(…)
{
int Values[4000];
Values[0]=0;
}
переменная локальная
Физическая память Физическая память Зарезервированная страница Зарезервированная страница |
четыре страницы
При создании стека резервируется 16000 байт. Физическая память выделена только двум страницам, поэтому при компиляции программы вставляется дополнительный код. Этот дополнительный код работает по следующему алгоритму:
nByteNeeded = nByteNeeded – размер страницы |
ОС выделяет физическую память |
Запись на страницу |
Указатель стека смещается на страницу вниз |
Выход |
nByteNeeded > размера страницы |
Определение положения указателя стека |
Определение размера страницы |
Ф.С. Ф.С. Ф.С. |
9. Кучи в Windows NT (2000). Структура кучи в Win32. Функции управления кучей Win32.