-316 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 378
1

Стеки с чем едят?

13.07.2023, 10:32. Показов 1116. Ответов 21

Author24 — интернет-сервис помощи студентам
Всем привет. Смотрел инфу в инете и задался нескольким вопросами.

Подскажите пожалуйста

1. Что будет если стек будет переполнен?
2. Такое вообще бывает когда стек переполнен?
3. Как увеличить стек?
4. Можно ли создать 2 стека?
5. Скажем 5000 переменных храниться в одном стеки 1 мегабайт или эти переменные храниться в разных стеках?
6. Память под стек максимум 1мб или можно уменьшить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2023, 10:32
Ответы с готовыми решениями:

Expression и с чем его едят
Доброго вечера всем! Хочу задать вопрос. В жизни пришлось столкнуться с Выражениями и Деревьями...

Непонятки. Тестирование приложений C# и с чем его едят
Добрый день! Целый день потратил на поиски информации о правильной организации тестирования своих...

Паттерн MVC в Windows Forms. С чем едят?
Доброго времени, уважаемые форумчане. Пишу приложение которое умеет: 1. Извлекать данные из xml...

API как и с чем с чем его едят?
Добрался до API, прошу вас кинуть материала где можно почитать про него, а также интересует что-то...

Динамические сборки и с чем их едят
Господа прошу прощения если опубликовал что-то не так. И так приступим, я много прочитал про...

21
653 / 589 / 171
Регистрация: 17.07.2012
Сообщений: 1,670
Записей в блоге: 1
13.07.2023, 10:44 2
Мистер Джек,
1. StackOverflowException
2. Да, можете рекурсию бесконечную написать
3. Никак
4. Нет. 1 стек на 1 поток
5. В одном
6. Нет

Памяти под стек навалом, если у вас в методе 50000 локальных переменных - то вы делаете явно что-то не так.
1
1143 / 872 / 505
Регистрация: 09.04.2014
Сообщений: 2,054
13.07.2023, 10:49 3
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Смотрел инфу в инете и задался нескольким вопросами.
у меня встречный вопрос: вы о коллекции типа Stack<T> или о стеке выполнения?
0
653 / 589 / 171
Регистрация: 17.07.2012
Сообщений: 1,670
Записей в блоге: 1
13.07.2023, 11:25 4
UPD: Я походу обманул на счет минимальных/максимальных размеров стека: для разных платформ, типов приложений и версий фреймворка размеры могут отличаться.

Добавлено через 6 минут
UPD2: И даже ручками можно размер конфигурировать для потока
1
-316 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 378
13.07.2023, 12:46  [ТС] 5
А как тогда. Скажем работаем, работаем и память в стеки закончилась. Что в этом случае делать? Я про потоки еще не изучал. Подскажите в кратце. Каждый поток это новый стек?

Добавлено через 6 минут
nedel, я вообще про стеки вообще (логика)! Хочу понять. Как я понял в стеки выделяется 1мб и вот мы работаем и он может закончиться. И что в этом случае делать, я не представляю!
0
Эксперт .NET
1693 / 1322 / 316
Регистрация: 15.06.2012
Сообщений: 5,032
Записей в блоге: 3
13.07.2023, 13:04 6
Цитата Сообщение от Cupko Посмотреть сообщение
UPD: Я походу обманул на счет минимальных/максимальных размеров стека: для разных платформ, типов приложений и версий фреймворка размеры могут отличаться.
Разве там не от железа в первую очередь зависит?

Чуть докину
Цитата Сообщение от Мистер Джек Посмотреть сообщение
1. Что будет если стек будет переполнен?
ошибка StackOverflowException, которую нельзя отловить в try-catch. Самая частая причина -- вечная рекурсия (вызов метода самого себя), аля
C#
1
2
3
MyMethod();
 
void MyMethod() => MyMethod();
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Скажем 5000 переменных храниться в одном стеки 1 мегабайт или эти переменные храниться в разных стеках?
Очень сомнительная ситуация насчет количества. Массив -- это 1(одна) переменная-указатель. Т.е. она не множится на количество внутренних элементов. Тоже самое с полями класса -- они хранятся в "куче". Если вы реально напишете код с таким количеством (например многоуровневый сложный код с кучей методов) -- все равно хватит. 1Мб по 8байт это где-то 130к элементов.
1
653 / 589 / 171
Регистрация: 17.07.2012
Сообщений: 1,670
Записей в блоге: 1
13.07.2023, 13:27 7
Цитата Сообщение от Wolfdp Посмотреть сообщение
Разве там не от железа в первую очередь зависит?
Я просто бегло погуглил, и нашел много разных нюансов, типа:
Some applications override reserved address space and initially committed to optimize memory usage. As an example, the maximum stack size of an IIS native process's thread is 256 KB
For <TargetFramework>net5.0</TargetFramework> (and earlier versions of .NET Core), the output for main is "Main Stack Size : 1536 KB". So the stack size for .NET Core has increased by 50%.
Default stack size for 64bit processes is 4MB, it is 1MB for 32bit processes. You can modify the main-threads stack size by changing the value in its PE header. You can also specify the stack size by using the right overload of the Thread constructor.
В общем, надо разбираться, сходу тут сложно точно ответить
0
388 / 253 / 66
Регистрация: 12.04.2020
Сообщений: 1,326
13.07.2023, 13:28 8
во щас будет ржака
но int, double, float и тд не хранятся в стеке
0
Эксперт .NET
17684 / 12870 / 3365
Регистрация: 17.09.2011
Сообщений: 21,135
13.07.2023, 14:27 9
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Скажем работаем, работаем и память в стеки закончилась. Что в этом случае делать?
Внимательно изучить код и найти причину, по которой возникает такая огромная вложенность вызовов или локальные переменные отжирают столько стековой памяти.
После чего эту причину устранить уменьшением глубины вызвов и вынесением "тяжелых" переменных в кучу.
1
Модератор
5046 / 3275 / 526
Регистрация: 01.06.2013
Сообщений: 6,802
Записей в блоге: 9
13.07.2023, 14:57 10
Если не ошибаюсь, компилятор C# не поддерживает tail call optimization, по этому даже хвостовая рекурсия улетает в StackOverflowException при большом количестве итераций. (А, к примеру, F# поддерживает).
2
-316 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 378
13.07.2023, 15:46  [ТС] 11
Тогда получается это уязвимость системы. Насколько я понимаю что стек всего один (постоянно) и работает он при запуска программы до закрытие программы. И его память 1 мб. Которую не как нельзя изменить в большую сторону.

1. Если скажем у меня по логике программы нужно использовать больше 1 мб в стеки это не как нельзя обойти эти ограничения?
2. Я в этом не особо силен. Это лишь просто предположение.Скажем останавливаем программу и делаем зацикливание постоянного добавления ФИО. И если скажем в программе идет добавление ФИО через переменную то стек переполняется и программа вылетает. И отловить не как нельзя будет. Программа будет взломана. Или скажем если такое возможно. Запускаем одну и туже операцию, как бы с нескольких компов много раз. И опять идет переполнение стека?

Почему нет не какой защиты от переполнение стека? Почему именно 1мб на стек на всю программу?
0
31 / 29 / 8
Регистрация: 12.12.2020
Сообщений: 256
13.07.2023, 15:52 12
Компилятору вроде можно сказать какой размер стека, он выделит если сможет.
0
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
13.07.2023, 15:58 13
Цитата Сообщение от Мистер Джек Посмотреть сообщение
всего один (постоянно) и работает он при запуска программы до закрытие программы.
А еще он растет в сторону уменьшения адресов.

Добавлено через 4 минуты
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Почему именно 1мб на стек на всю программу?
Потому что стек был придуман для быстрой передачи параметров и выделения быстрой памяти под локальные переменные исполняемого метода. И освобождение этой памяти тоже производится очень быстро - надо просто сбросить указатель вершины стека на тот адрес, что был до вызова метода. Вообще тут на сцену выходят еще соглашения о вызовах. Можете погуглить.

Добавлено через 1 минуту
Исходники элементарных ассемблерных программ помогут прояснить принцип работы стека.
0
Эксперт .NET
1693 / 1322 / 316
Регистрация: 15.06.2012
Сообщений: 5,032
Записей в блоге: 3
13.07.2023, 15:59 14
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Тогда получается это уязвимость системы.
то что говнокодер напишет программу, которая завалится, называется не "уязвимость системы", а "забагованый софт".

Цитата Сообщение от Мистер Джек Посмотреть сообщение
Почему нет не какой защите от переполнение стека? Почему именно 1мб на стек на всю программу?
Потому что его хватает с головой. Есть задачи, когда для скорости используют память именно стека, а не в куче, но даже там оперируют очень небольшими объемами.

Цитата Сообщение от Мистер Джек Посмотреть сообщение
Скажем останавливаем программу и делаем зацикливание постоянного добавления ФИО.
Попробуйте для начала написать такой код. Быстро поймете что к чему.

Вы сейчас решаете придуманную проблему. Вот предположим 1Мб стека действительно мало. Неужели бы об этом сейчас молчали, а не указали пути решения?
1
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
13.07.2023, 16:04 15
Цитата Сообщение от Wolfdp Посмотреть сообщение
Вот предположим 1Мб стека действительно мало. Неужели бы об этом сейчас молчали, а не указали пути решения?
А еще говорят, что в 64-битных системах на большинстве обычных ПК для адресации используют всего 48-бит, ибо больше нафиг не требуется. Где-то на SO вычитал.
1
2277 / 1642 / 324
Регистрация: 14.08.2018
Сообщений: 5,426
Записей в блоге: 4
13.07.2023, 16:16 16
Я тут заметил одну вещь. Переписал свою прогу на NET 7 (WPF, DI и т.д.). Дак если её откомпилировать на 32 бита, то потребляет она максимум 100 (в среднем 60-80) мегов памяти, а если сделать релиз на Any CPU, то начинает жрать гораздо больше...
1
Эксперт .NET
12087 / 8363 / 1279
Регистрация: 21.01.2016
Сообщений: 31,537
14.07.2023, 05:01 17
Andrey-MSK, ну, логично. Указатели же начинают занимать в два раза больше места в куче. Все объекты становятся резко больше.

Добавлено через 1 минуту
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Если скажем у меня по логике программы нужно использовать больше 1 мб в стеки это не как нельзя обойти эти ограничения?
Это не логика программы, это - говнокод. У тебя есть гигабайты (а то и десятки гигабайт) в куче. Вот и натравливай на неё логику своей программы.
1
2277 / 1642 / 324
Регистрация: 14.08.2018
Сообщений: 5,426
Записей в блоге: 4
14.07.2023, 08:15 18
Цитата Сообщение от Usaga Посмотреть сообщение
Указатели же начинают занимать в два раза больше места в куче.
А вот про это я чего-то совсем забыл
1
Эксперт .NET
17684 / 12870 / 3365
Регистрация: 17.09.2011
Сообщений: 21,135
14.07.2023, 10:44 19
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Если скажем у меня по логике программы нужно использовать больше 1 мб в стеки это не как нельзя обойти эти ограничения?
Смотрите на это с другой стороны: размер стека вызовов — это обычно функция ОС, а не конкретно C# или .NET.
Вот у вас есть компьютер: виндовс, линукс, мак или что там еще существует. На нем работают тонны софта, включая игрушки и всякое другое тяжелое, вроде программ для работы с видео и изображениями.
Все они работают со стеком в 1 МБ и никто не валится и не крашится.
Ну, то есть проблемы как таковой не существует.
1
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,579
15.07.2023, 00:04 20
1 МБ хватит каждому (с)
1
15.07.2023, 00:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2023, 00:04
Помогаю со студенческими работами здесь

Mvvm и с чем его едят
Форумчане не так давно начал изучение wpf ,не подскажете что такое mvvm Патерн ?или где можно...

Хранимые процедуры - с чем их едят?
Привет! Просветите несведущего , что такое хранимые процедуры и собственно где их можно применять?...

wpf DataGrid с чем его едят?
Подскажите как в wpf добавить дата грид т.к. в референс библиотеку с хожим названием не нашел.

ReSharper что это и с чем едят?
сабж... желательно поподробнее и с простенькими примерами... копался в гугле, но нечего толкового...

Что такое DI фреймворки и с чем их едят
Здравствуйте уважаемые жители кибер-форума. У меня достаточно тривиальный вопрос, какими...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru