Текущий архив: 2007.09.23;
Скачать: CL | DM;
Внизлимит стека Найти похожие ветки
← →
DevilDevil © (2007-08-15 12:29) [0]как определить, сколько памяти в стеке я ещё могу взять?
ну вершину стека, понятно - esp
а как быть с "максимальной" вершиной?
← →
Сергей М. © (2007-08-15 12:35) [1]Имея селектор сегмента стека получить из GDT дескриптор этого сегмента и прочитать из него размер)
← →
Сергей М. © (2007-08-15 12:48) [2]
> DevilDevil
Вот тебе ликбез:
http://rsdn.ru/article/baseserv/stack.xml
← →
Сергей М. © (2007-08-15 13:36) [3]
> DevilDevil © (15.08.07 12:29)
А у тебя какая задача-то ? Глубину рекурсии ограничить что ли ?
← →
DevilDevil © (2007-08-15 14:23) [4]> А у тебя какая задача-то ? Глубину рекурсии ограничить что ли ?
столкнулся с такой вот вещью...
на определённое действие может понадобиться неопределённое, отностительно небольшое количество памяти. причём выделять/удалять такую память можно ОЧЕНЬ часто. Как вариант можно использовать GetMem/FreeMem. Или выделить какой-нибудь постоянный буфер килобайт на 500. Можно в стеке выделять огромный массив, так, чтобы точно хватило.
А так, взял указатель на самый край стека и пользуйся, сколько влезит :)
← →
DevilDevil © (2007-08-15 14:28) [5]забыл поблагодарить за статью.
распечатал, читаю.
← →
Сергей М. © (2007-08-15 14:38) [6]
> взял указатель на самый край стека и пользуйся, сколько
> влезит
Мои подозрения укрепились.
← →
vpbar © (2007-08-15 15:16) [7]>>Или выделить какой-нибудь постоянный буфер килобайт на 500.
ИМХО это понадежней будет, хотя если хочется поизвращатся
← →
DevilDevil © (2007-08-15 15:28) [8]> ИМХО это понадежней будет, хотя если хочется поизвращатся
да, понадёжнее...
но стек по умолчанию - 1мб (как написано в статье) - должно хватить.
Кстати, достаточно странно... если на каждый из 200-300 рабочих потоков выделять по 1мб, то озу мне явно должно нехватать...
Сомневаюсь, что разработчики различных приложений насильно укорачивают стек.
> Мои подозрения укрепились.
Статью почитал, но недопонял:
- Как взять информацию по потоку
- как определить адрес последней доступной (без Exception-а) страницы
← →
DrPass © (2007-08-15 15:33) [9]
> на определённое действие может понадобиться неопределённое,
> отностительно небольшое количество памяти. причём выделять/удалять
> такую память можно ОЧЕНЬ часто. Как вариант можно использовать
> GetMem/FreeMem
Вот и пользуйся GetMem/FreeMem - менеджер памяти сам позаботится о том, чтобы использовать
> какой-нибудь постоянный буфер килобайт на 500.
← →
DevilDevil © (2007-08-15 16:06) [10]> Вот и пользуйся GetMem/FreeMem - менеджер памяти сам позаботится
> о том, чтобы использовать
каким образом, если не секрет?
← →
Сергей М. © (2007-08-15 16:13) [11]
> DevilDevil © (15.08.07 15:28) [8]
> Как взять информацию по потоку
Да TIB же !
← →
DevilDevil © (2007-08-15 16:25) [12]> Сергей М. © (15.08.07 16:13) [11]
так:function GetTIB : PTIB;
asm
mov eax, fs:[$18]
end;
- правильно?
- стандартный тип под это дело есть?
- такой код сработает для любого текущего потока?
- какое поле указывает на последнюю доступную страницу (т.е. первую) ?
← →
DevilDevil © (2007-08-15 16:26) [13]- можно ли в Delphi самостоятельно задать размер стека?
← →
Сергей М. © (2007-08-15 16:26) [14]
> DevilDevil © (15.08.07 16:25) [12]
Ты вообще статью-то читал ?
Или фрагментарно ?)
← →
DevilDevil © (2007-08-16 11:12) [15]> Сергей М. © (15.08.07 16:26) [14]
Многое не понял.
1мб стека - это множество страниц памяти; последняя страница "свободна", предпоследняя имеет флаг защиты. Как только я залезаю на предпоследнюю страницу, генерируется исключение, "освобождается" следующая страница... в этот же момент имеется возможность проверки на StackOverflow.
- зачем такая сложность со страницами, когда можно было резервировать только первую страницу, и при обращении к ней генерировать Exception переполнения стека ?
- совсем ли корректно обработается механизм назначения флагов, если я запрошу более 2х страниц стека ?
- а если в момент запроса несколькольких страниц я "перепрыгну" самую первую страницу, то получу AccessViolation вместо StackOverflow ?
под обращением к странице я подразумеваю что то типа:var
ARR: array[0..4096*2-1] of char;
begin
Caption := ARR[0];
- TIB находится в потоке. Мне необходимо получить указатель на такие данные. Вышеуказанный код корректен?
P.S. а ещё я не представляю, что такое "селектор"
← →
Сергей М. © (2007-08-16 11:56) [16]
> зачем такая сложность со страницами
Так задумано разработчиками ОС, прими это как данность.
> если в момент запроса несколькольких страниц я "перепрыгну"
> самую первую страницу, то получу AccessViolation вместо
> StackOverflow ?
StackOverflow ты точно не получишь, а вот получишь ли AV - это зависит от прав на доступ к странице, в АП которой твое обращение попадает.
> Вышеуказанный код корректен?
Какой ? GetTIB ? Да, вполне корректен.
> не представляю, что такое "селектор"
Тяжко тебе придется)
Если вкратце, то селектор (точнее - селектор дескриптора сегмента) - это значение, представляющее собой смещение структуры описателя сегмента в таблице описателей сегментов.
Эти селекторы хранятся в регистрах селекторов ЦП (ds, es, fs, gs, ss), последний (stack selector) как раз и хранит значение селектора дескриптора сегмента стека в глобальной таблице дескрипторов (GDT)
← →
Сергей М. © (2007-08-16 12:01) [17]Мне вот одно непонятно - за каким лешим тебя приспичило хранить большие объемы данных именно в стеке (всякий раз рискуя при этом достичь его переполнения), если для этого придумана куча, с которой собссно и работают ф-ции стандартного менеджера памяти ?
← →
DevilDevil © (2007-08-16 13:12) [18]> Эти селекторы хранятся в регистрах селекторов ЦП (ds, es,
> fs, gs, ss), последний (stack selector) как раз и хранит
> значение селектора дескриптора сегмента стека в глобальной
> таблице дескрипторов (GDT)
ничего так и не стало понятно. По сему поводу надо будет умные книжки почитать.
> Мне вот одно непонятно - за каким лешим тебя приспичило
> хранить большие объемы данных именно в стеке (всякий раз
> рискуя при этом достичь его переполнения), если для этого
> придумана куча, с которой собссно и работают ф-ции стандартного
> менеджера памяти ?
- GetMem/FreeMem, предполагаю, медленны (если делать это, скажем, 100 раз в секунду)
- дополнительный буфер на 500кб обслуживать лень (было)
- тут не переполнение, тут "затирание" грозит... хотя 1мб - это очень даже много
← →
Сергей М. © (2007-08-16 13:16) [19]
> GetMem/FreeMem, предполагаю, медленны
Если даже так, то ничто не мешает заменить стандартный менеджер любым другим менеджером, подходящим по этому требованию.
← →
DevilDevil © (2007-08-16 14:14) [20]В любом случае, спасибо за ответы!
← →
GrayFace © (2007-08-28 18:54) [21]В Grids.pas есть функции типа StackAlloc - может тебе они нужны? Правда, они выделяют память до момента выхода из метода.
DevilDevil © (16.08.07 11:12) [15]
под обращением к странице я подразумеваю что то типа:
var
ARR: array[0..4096*2-1] of char;
begin
Caption := ARR[0];
Вот и посмотри в дебаге в Ctrl+Alt+C, что делает Дельфи, чтобы перепрыгивания не было.
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.047 c