Этот вопрос озадачивает меня в течение многих лет и рассматривает это название сайта, это место, о котором нужно спросить.
Почему у нас, программистов, все еще есть эта проблема StackOverflow
?
Почему на каждом главном языке память стека потоков должна быть статически распределена при создании потока?
Я буду говорить в контексте С#/Java, потому что я использую их больше всего, но это, вероятно, более широкая проблема.
Фиксированный размер стека приводит к огромным проблемам:
- Невозможно написать рекурсивный алгоритм, если вы не уверены, что глубина рекурсии крошечная. Линейная сложность памяти рекурсивного алгоритма часто неприемлема.
- Существует нет дешевого способа запуска новых потоков. Вы должны выделить огромный блок памяти для стека для учета всех возможных применений потока.
- Даже если вы не используете очень глубокую рекурсию, у вас всегда есть риск исчерпать пространство стека по той причине, что размер стека является произвольным фиксированным числом. Учитывая, что StackOverflow обычно невосстанавливается, это большая проблема в моих глазах.
Теперь, если стек был изменен динамически, все вышеперечисленные проблемы были бы значительно облегчены, поскольку переполнение стека было бы возможно только при переполнении памяти.
Но это еще не так. Зачем? Существуют ли некоторые фундаментальные ограничения современных процессоров, которые сделают невозможным/неэффективным? Если вы думаете о производительности, которую накладывают перераспределения, это должно быть приемлемым, потому что люди все время используют структуры типа ArrayList
, не страдая много.
Итак, вопрос в том, что я что-то упускаю, а StackOverflow не проблема, или я что-то упускаю, и есть много языков с динамическим стеком, или есть какая-то большая причина для этого невозможно/трудно реализовать?
Edit: Некоторые люди говорили, что производительность будет большой проблемой, но подумайте над этим:
- Мы оставляем скомпилированный код нетронутым. Доступ к стекю остается прежним, поэтому производительность "обычного случая" остается прежней.
- Мы обрабатываем исключение CPU, которое происходит, когда код пытается получить доступ к нераспределенной памяти и запускает нашу процедуру "перераспределения". Перераспределение не будет частым, потому что < положить свой обычный аргумент ArrayList здесь > . Должен работать на большинстве процессоров с защищенным режимом без потери производительности. Нет?