2010-04-30 3 views

ответ

6

по умолчанию составляет 1 МБ для обоих native и CLR нитей. Вы можете изменить его, хотя обычно это плохая идея.

+1

Он резервирует только 1 МБ. Он получает физическую поддержку, пока не будет использован. Почему вы говорите, что это плохая идея изменить его? Стек обычно может выходить за пределы первоначального резерва, и если 1MB переполняет простой поток, вы просто нарезаете свое адресное пространство. –

+0

Я не сказал, что это плохая идея. Я сказал, что это просто идея. Создание gazillions потоков, как правило, является неправильным решением проблемы, поэтому уменьшение размера стека только для того, чтобы вы могли создавать gazillions потоков, это почти наверняка ошибка. Да, есть обстоятельства, когда настройка размера стека может дать прибыль, но это должны делать только те, кто действительно знает, что они делают. Кроме того, я не уверен, что вы имеете в виду: «Стек обычно может выходить за пределы первоначального резерва». AFAIK, нет API для роста стека. –

+0

@Adrian - это распространенное заблуждение. [CLR на самом деле ** фиксирует ** 1 МБ ОЗУ на поток для стека.] (Http://www.bluebytesoftware.com/blog/PermaLink,guid,733d7537-f982-4886-af62-66bed0f97ab5.aspx) –

1

Накладные расходы памяти (в ОЗУ) будут одной страницей памяти. Таким образом (в зависимости от вашей платформы) это, вероятно, будет 4 КБ.

Размер стека по умолчанию для обоих составляет 1 МБ. Однако это только виртуальная память, так что на нее не наложен избыточный объем оперативной памяти, если он не используется.

+0

Это не относится к управляемому коду. CLR всегда предварительно фиксирует стек потоков управляемых потоков, поэтому для потоков CLR стек оценивается с лимитом фиксации. Конечно, это еще не физическая память, пока она не коснется. – Stewart

+2

То, что я написал (или хотел). Я уточнил ответ, чтобы пояснить, что он описывает накладные расходы RAM. – Foxfire

3

Просмотрите блог Mark Russinovich о win32 kernel limits для описания того, насколько велика одна нить и сколько накладных расходов используется.

Сколько ресурсов, которые использует поток .NET, может быть трудно предсказать. Я бы предположил, не намного больше.

+0

@Christopher: +1 для ссылки –

1

В соответствии с предыдущими ответами основные накладные расходы составляют 1 МБ на каждую нить. Я не буду вникать в различные нюансы - другие ответы их охватывают.

Для потоков Microsoft Visual C/C++ у вас также есть накладные расходы на потоки любого рабочего пространства рабочей среды C, которое распределяется по требованию (и сохраняется с помощью локального хранилища потоков TlsAlloc()) для выполнения таких операций, как sprintf(), scanf(), strtol() и т. д. У меня нет точных цифр - вам нужно будет сканировать источник на Microsoft CRT, чтобы вычислить это.

Для других периодов времени работы C/C++ (gcc/g ++/borland/digital mars) могут быть или не быть одинаковые данные для каждой нити, их деталь реализации.

Никто из нас не знает внутренних компонентов .Net Execution Engine, но есть, вероятно, некоторые данные о потоках, хранящиеся там. Трудно понять, что такое накладные расходы.

Смежные вопросы