Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

лимит стека   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.04 c
2-1188311501
Flight_
2007-08-28 18:31
2007.09.23
всплывающая подсказка


1-1184211090
Phoenix
2007-07-12 07:31
2007.09.23
Необходимо определить были ли пороизведенны изменения на форме


15-1187957551
cyborg
2007-08-24 16:12
2007.09.23
Посоветуйте программу


15-1187867268
oldman
2007-08-23 15:07
2007.09.23
ННМП-2007


15-1187876173
iXT
2007-08-23 17:36
2007.09.23
Почему нельзя сменить ник(login) в анкете?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский