В чем смысл небольшого стека, даже когда память доступна? - PullRequest
5 голосов
/ 23 сентября 2011

Недавно меня спросили в интервью, зачем вам иметь меньший стек, когда доступная память не имеет ограничений? Зачем вам это в диапазоне 1 КБ, даже если у вас 4 ГБ физической памяти? Это стандартная практика проектирования?

Ответы [ 7 ]

7 голосов
/ 24 сентября 2011

Другие ответы хороши;Я просто подумал, что укажу на важное недоразумение, присущее этому вопросу. Сколько у вас физической памяти совершенно не имеет значения .Увеличение физической памяти - это просто оптимизация;это предотвращает необходимость использовать диск в качестве хранилища.Ценный ресурс, потребляемый стеком, составляет адресное пространство , а не физическая память .Биты стека, которые сейчас не используются, даже не будут находиться в физической памяти;они будут выгружены на диск.Но как только они фиксируются, они занимают виртуальное адресное пространство.

5 голосов
/ 23 сентября 2011

Чем меньше ваши стеки, тем больше их вы можете иметь.Стек 1 КБ довольно бесполезен, так как я не могу представить архитектуру, в которой страницы настолько малы.Более типичный размер - 128 КБ-1 МБ.

Поскольку каждый поток имеет свой собственный стек, количество стеков, которое вы можете иметь, является верхним пределом количества потоков, которые вы можете иметь.Некоторые люди жалуются на то, что они не могут создать более 2000 потоков в стандартном 2 ГБ адресном пространстве 32-разрядного процесса Windows, поэтому неудивительно, что некоторые люди хотят, чтобы даже меньшие стеки позволяли создавать еще больше потоков.*

Кроме того, учтите, что если стек должен быть полностью зарезервирован заранее, он выделяет кусок из вашего адресного пространства, который не может быть возвращен, пока стек больше не используется (т. Е. Поток завершается),Этот кусок зарезервированного адресного пространства ограничивает размер непрерывного выделения, которое вы можете сделать.

1 голос
/ 27 сентября 2011

В других ответах здесь уже упоминается основная концепция, что наиболее значительным потребляемым ресурсом стека является адресное пространство (поскольку для его реализации требуются куски непрерывного адресного пространства) и что пространство по умолчанию, потребляемое в окнах для каждого потока, не является незначительным.

Однако полная история чрезвычайно нюансирована (и может и будет меняться со временем) на многих уровнях и уровнях.

Эта статья Марка Руссиновича как часть его "Расширения границ Windows"Серия переходит в чрезвычайно подробные уровни анализа .Однако эта работа ни в коем случае не является вводной статьей, и большинство людей не сочли бы ее тем, о чем можно было бы узнать в ходе собеседования, если, возможно, вы не брали интервью для работы в этой конкретной области.

1 голос
/ 25 сентября 2011

Здесь есть две вещи. Во-первых, ограничение размера стека будет устанавливать ограничение на количество процессов / потоков в системе. Кроме того, ограничение связано не с размером физической памяти, а с ограничением адресуемой виртуальной памяти. Во-вторых, редко процессы / потоки нуждаются в большем размере стека, чем это, и если они делают, они могут попросить об этом (библиотеки справляются с этим без проблем). Поэтому при запуске нового процесса / потока имеет смысл предоставить им небольшое пространство стека.

1 голос
/ 23 сентября 2011

Одна из причин в том, что, хотя память в наши дни огромна, она все еще , а не безгранична.32-разрядный процесс обычно ограничен 4 ГБ адресного пространства (да, вы можете использовать PAE для его увеличения, но для этого требуется поддержка со стороны ОС и возврат к модели сегментированной памяти.) Каждый поток использует часть этой памяти дляего стек, и если размер стека составляет мегабайты - независимо от того, находится он в памяти или нет - он занимает значительную часть адресного пространства приложения.

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

1 голос
/ 23 сентября 2011

Я не знаю «реального» ответа, но я предполагаю:

  • Это совершено по требованию.

  • Делатьвам действительно это нужно?

Если система использует 1 МБ для стека, то типичная система с 1024 потоками будет использовать 1 ГБ памяти для (в основном) ничего ... чтоможет быть не тем, что вы хотите, тем более что вам это не нужно.

0 голосов
/ 23 сентября 2011

Возможно, потому что каждый раз, когда вы вызываете функцию, ОС должна выделять память, чтобы быть стеком этой функции. Поскольку функции могут объединяться в цепочку, несколько вызовов функций повлекут за собой большее выделение стека. Большой размер стека по умолчанию, такой как 4GiB, был бы непрактичным. Но это только мое предположение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...