Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.345 c
15-1188109001
norman
2007-08-26 10:16
2007.09.23
планировщик


15-1188226793
неискушенный
2007-08-27 18:59
2007.09.23
Просто интересно


15-1185653379
Альберт_
2007-07-29 00:09
2007.09.23
а какой актив икс работет на всех виндах с gif, jpg, bmp


4-1175102152
Express
2007-03-28 21:15
2007.09.23
Как посласть сообщение о нажатие кнопки "Отмена" в MessageDLG?


11-1171955913
ryslan56
2007-02-20 10:18
2007.09.23
Бывалым