Каков эффект от запуска приложения с размером «Unlimited Stack»? - PullRequest
2 голосов
/ 02 июня 2010

Я унаследовал некоторый код, который мне нужно поддерживать, который иногда может быть менее стабильным. Предыдущие люди больше не могут задавать вопросы о том, почему они запускали приложение в среде с неограниченным набором стеков. Мне интересно, каковы могут быть последствия этого? Кажется, что в приложении есть некоторые непредсказуемые ошибки памяти, которые мы не можем найти, и запуск приложения под Valgrind невозможен, поскольку он настолько сильно замедляет приложение, что мы не можем его запустить. Поэтому любые мысли о том, каковы могут быть последствия этого, приветствуются.

1 Ответ

2 голосов
/ 02 июня 2010

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

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

Как правило, вам не нужен большой стек, но выделение больших объектов в стеке или глубокая рекурсия могут быть проблемой для некоторых программ, тогда им нужен больший стек.

Редактировать: Просто чтобы добавить к вопросу о том, чтобы быть однопоточным. В многопоточных программах вам нужно выделить более одного стека. Такого рода путаница растёт с обоих концов к среднему подходу. В этом случае стеки выделяются в чанках max-stack-size-ish со стороны стека пространства памяти. Затем, когда вы разрываете свой стек, вы попираете стек другого потока. В зависимости от вашей архитектуры, вы можете добавить некоторую защиту страницы, чтобы ограничить это, но на данный момент это, вероятно, TMI; -)

...