Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

лимит стека


Страницы:   1 2

DevilDevil ©   (2007-08-15 12:29:00) 

как определить, сколько памяти в стеке я ещё могу взять?

ну вершину стека, понятно - esp
а как быть с "максимальной" вершиной?


GrayFace   (2007-08-28 18:54:00) [1]

В 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, что делает Дельфи, чтобы перепрыгивания не было.


DevilDevil   (2007-08-16 14:14:00) [2]

В любом случае, спасибо за ответы!


Сергей М.   (2007-08-16 13:16:00) [3]


> GetMem/FreeMem, предполагаю, медленны


Если даже так, то ничто не мешает заменить стандартный менеджер любым другим менеджером, подходящим по этому требованию.


DevilDevil   (2007-08-16 13:12:00) [4]

> Эти селекторы хранятся в регистрах селекторов ЦП (ds, es,
>  fs, gs, ss), последний (stack selector) как раз и хранит
> значение селектора дескриптора сегмента стека в глобальной
> таблице дескрипторов (GDT)


ничего так и не стало понятно. По сему поводу надо будет умные книжки почитать.


> Мне вот одно непонятно - за каким лешим тебя приспичило
> хранить большие объемы данных именно в стеке (всякий раз
> рискуя при этом достичь его переполнения), если для этого
> придумана куча, с которой собссно и работают ф-ции стандартного
> менеджера памяти ?


- GetMem/FreeMem, предполагаю, медленны (если делать это, скажем, 100 раз в секунду)
- дополнительный буфер на 500кб обслуживать лень (было)
- тут не переполнение, тут "затирание" грозит... хотя 1мб - это очень даже много


Сергей М.   (2007-08-16 12:01:00) [5]

Мне вот одно непонятно - за каким лешим тебя приспичило хранить большие объемы данных именно в стеке (всякий раз рискуя при этом достичь его переполнения), если для этого придумана куча, с которой собссно и работают ф-ции стандартного менеджера памяти ?


Сергей М.   (2007-08-16 11:56:00) [6]


> зачем такая сложность со страницами


Так задумано разработчиками ОС, прими это как данность.


> если в момент запроса несколькольких страниц я "перепрыгну"
> самую первую страницу, то получу AccessViolation вместо
> StackOverflow ?


StackOverflow ты точно не получишь, а вот получишь ли AV - это зависит от прав на доступ к странице, в АП которой твое обращение попадает.


> Вышеуказанный код корректен?


Какой ? GetTIB ? Да, вполне корректен.


> не представляю, что такое "селектор"


Тяжко тебе придется)

Если вкратце, то селектор (точнее - селектор дескриптора сегмента) - это значение, представляющее собой смещение структуры описателя сегмента в таблице описателей сегментов.

Эти селекторы хранятся в регистрах селекторов ЦП (ds, es, fs, gs, ss), последний ( stack selector) как раз и хранит значение селектора дескриптора сегмента стека в глобальной таблице дескрипторов (GDT)


DevilDevil   (2007-08-16 11:12:00) [7]

> Сергей М. ©   (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-15 16:26:00) [8]


> DevilDevil ©   (15.08.07 16:25) [12]


Ты вообще статью-то читал ?

Или фрагментарно ?)


DevilDevil   (2007-08-15 16:26:00) [9]

- можно ли в Delphi самостоятельно задать размер стека?


DevilDevil   (2007-08-15 16:25:00) [10]

> Сергей М. ©   (15.08.07 16:13) [11]

так:

function GetTIB : PTIB;
asm
  mov eax, fs:[$18]
end;


- правильно?
- стандартный тип под это дело есть?
- такой код сработает для любого текущего потока?
- какое поле указывает на последнюю доступную страницу (т.е. первую) ?


Сергей М.   (2007-08-15 16:13:00) [11]


> DevilDevil ©   (15.08.07 15:28) [8]


> Как взять информацию по потоку


Да TIB же !


DevilDevil   (2007-08-15 16:06:00) [12]

> Вот и пользуйся GetMem/FreeMem - менеджер памяти сам позаботится
> о том, чтобы использовать


каким образом, если не секрет?


DrPass   (2007-08-15 15:33:00) [13]


> на определённое действие может понадобиться неопределённое,
>  отностительно небольшое количество памяти. причём выделять/удалять
> такую память можно ОЧЕНЬ часто. Как вариант можно использовать
> GetMem/FreeMem

Вот и пользуйся GetMem/FreeMem - менеджер памяти сам позаботится о том, чтобы использовать
> какой-нибудь постоянный буфер килобайт на 500.


DevilDevil   (2007-08-15 15:28:00) [14]

> ИМХО это понадежней будет, хотя если хочется поизвращатся

да, понадёжнее...
но стек по умолчанию - 1мб (как написано в статье) - должно хватить.
Кстати, достаточно странно... если на каждый из 200-300 рабочих потоков выделять по 1мб, то озу мне явно должно нехватать...

Сомневаюсь, что разработчики различных приложений насильно укорачивают стек.

> Мои подозрения укрепились.

Статью почитал, но недопонял:
- Как взять информацию по потоку
- как определить адрес последней доступной (без Exception-а) страницы


vpbar   (2007-08-15 15:16:00) [15]

>>Или выделить какой-нибудь постоянный буфер килобайт на 500.
ИМХО это понадежней будет, хотя если хочется поизвращатся


Сергей М.   (2007-08-15 14:38:00) [16]


> взял указатель на самый край стека и пользуйся, сколько
> влезит


Мои подозрения укрепились.


DevilDevil   (2007-08-15 14:28:00) [17]

забыл поблагодарить за статью.
распечатал, читаю.


DevilDevil   (2007-08-15 14:23:00) [18]

> А у тебя какая задача-то ? Глубину рекурсии ограничить что  ли ?

столкнулся с такой вот вещью...
на определённое действие может понадобиться неопределённое, отностительно небольшое количество памяти. причём выделять/удалять такую память можно ОЧЕНЬ часто. Как вариант можно использовать GetMem/FreeMem. Или выделить какой-нибудь постоянный буфер килобайт на 500. Можно в стеке выделять огромный массив, так, чтобы точно хватило.

А так, взял указатель на самый край стека и пользуйся, сколько влезит :)


Сергей М.   (2007-08-15 13:36:00) [19]


> DevilDevil ©   (15.08.07 12:29)


А у тебя какая задача-то ? Глубину рекурсии ограничить что ли ?


Сергей М.   (2007-08-15 12:48:00) [20]


> DevilDevil


Вот тебе ликбез:

http://rsdn.ru/article/baseserv/stack.xml


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо