Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2017, 22:56   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Стек в программах

Что можно сказать об использовании стека программами?
Как связан аппаратный стек и стеки потоков?
Знает ли программа при старте, сколько ей нужно стековой памяти?
Если размер сегментов памяти 64к, как стек может занимать до 10 мб, если он расположен в сегменте?
Что происходит при переполнении стека? Почему он не может расти дальше как куча?
Aoizora вне форума Ответить с цитированием
Старый 23.08.2017, 23:32   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Как связан аппаратный стек и стеки потоков?
Во время смены контекстов регистры перезагружаются, в том числе и отвечающие за аппаратный стек.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Знает ли программа при старте, сколько ей нужно стековой памяти?
Программа знать не может ведь её поведение зависит от пользователя.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Если размер сегментов памяти 64к, как стек может занимать до 10 мб, если он расположен в сегменте?
Значит либо сегменты не 64кб, либо стек не 10 мб.
Если говорить о x86 то там начиная с х386 сегменты по 4ГБ. А в 64-биной ещё больше.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Что происходит при переполнении стека? Почему он не может расти дальше как куча?
Всмысле? Он так и растёт как куча только в другую сторону.
Если стек исчерпал всю доступною ему память то срабатывает защита она кидается исключение. А дальше цепочка обработчиков исключений пробуют восстановить последнее рабочее состояние программы, а если не получилось, то убивают программу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 24.08.2017, 15:40   #3
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

И я снова не понимаю: если аппаратный стек находится в сегменте SS, и сегменты в современных моделях памяти могут быть по 4 Гб и больше, то какой смысл несут фразы типа "компилятор студии выделяет стек размером 1 мб" и "стек на маках 512 кб"?
Aoizora вне форума Ответить с цитированием
Старый 24.08.2017, 15:51   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
амяти могут быть по 4 Гб и больше, то какой смысл несут фразы типа "компилятор студии выделяет стек размером 1 мб" и "стек на маках 512 кб"?
Память для стека выделяется сразу при запуске процесса.
Если бы под стек выделялось 4 Гб, то Ваш
"Hello world" сразу бы жрал минимум 4 Гб оперативы перманентно.
Стек - гарантированно выделенное пространство.
Если Вы превысили его размер - вон из хаты.
Croessmah вне форума Ответить с цитированием
Старый 24.08.2017, 15:52   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Ключевое слово тут
Цитата:
Сообщение от Aoizora Посмотреть сообщение
могут быть
Реально сегмент как раз и будет столько, сколько выделено.
Или вы хотите, чтобы ОС меняла размер сегмента стека "на ходу"?
Black Fregat вне форума Ответить с цитированием
Старый 24.08.2017, 16:22   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
компилятор студии выделяет стек размером 1 мб
Компилятор студии выделяет стек сколько скажете. 1мб это по умолчанию.
И смотреть надо на SS а на ESP.
waleri вне форума Ответить с цитированием
Старый 24.08.2017, 16:42   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Aoizora
Цитата:
Сообщение от Aoizora Посмотреть сообщение
И я снова не понимаю: если аппаратный стек находится в сегменте SS, и сегменты в современных моделях памяти могут быть по 4 Гб и больше, то какой смысл несут фразы типа "компилятор студии выделяет стек размером 1 мб" и "стек на маках 512 кб"?
Сегменты это атавизм. Вместо них используют страницы.
Хотя и сегменты по 4ГБ, но они перекрываютcя. Все сегменты отображаются на линейное арестное пространство размером 4 ГБ.
И эти 4 Гб надо поделить на всё: ОС, динамическая память, стационарная память куча, код, стек, динамические библиотеке. Так ещё каждому процессу нужен свой стек. Да и скажу вам что и куча там не дна, а их несколько.
Вот и встаёт вопрос как разделить память?
Логично что ограничить размер, что-бы другим хватило памяти. Бог велел делиться.

Цитата:
Сообщение от Aoizora Посмотреть сообщение
"компилятор студии выделяет стек размером 1 мб"
Да выделяет. Этот размер прописывается в исполняемом файле. При старте процесса ОС считывает эти данные из файла и выделяет столько памяти под стек сколько указано.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 24.08.2017, 18:43   #8
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

>Этот размер прописывается в исполняемом файле

Где-то в PE-заголовках?
Aoizora вне форума Ответить с цитированием
Старый 24.08.2017, 19:04   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Нет, в произвольном месте.... Естественно, в заголовках.
p51x вне форума Ответить с цитированием
Старый 24.08.2017, 19:51   #10
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Да, нашел.

https://msdn.microsoft.com/ru-ru/lib...(v=vs.85).aspx
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов только один - Delphi FunnyNeo Общие вопросы Delphi 0 09.04.2017 11:50
Стек и очередь. Задачи никогда не попадают в стек - Delphi Exxodus Помощь студентам 1 05.04.2016 14:12
Реклама в программах ivan_b Общие вопросы Delphi 9 15.01.2012 15:50
Использование '@' в программах Studik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 16.02.2011 20:08