Win32 и память ядра выделены
Я не совсем уверен, как работает .NET-часть, но если среда выполнения решит создать реальный поток с ОС, она в конечном итоге вызовет Win32 API CreateThread в kernel32.dll, возможно, из mscorlib.ni.dll
По умолчанию новые потоки получают 1 МБ виртуального адреса для стека, который фиксируется по мере необходимости.Это можно контролировать с помощью параметра maxStackSize
.Размер стека основного потока определяется параметром в самом исполняемом файле.
В адресном пространстве процесса будет выделен TEB (блок среды потока) ( см. Также ).Кстати, регистр FS на x86 указывает на такие вещи, как локальное хранилище потоков и структурированная обработка исключений (SEH).Вероятно, Win32 выделяет другие вещи, которые не документированы.
При создании потока Win32 происходит обращение к процессу сервера Win32 (csrss.exe).Вы можете видеть, что csrss имеет дескрипторы, открытые для всех процессов Win32 и потоков в Process Explorer для некоторого вида бухгалтерского учета.
DLL-библиотеки, загруженные в процесс, будут уведомлены о новом потоке и могут выделить свою собственную память для отслеживанияthread.
Ядро создаст объект ETHREAD
[ layout ] (производный от KTHREAD) из невыгружаемого пула ядра для отслеживания состояния потока.Также будет выделен стек ядра (по умолчанию 12k для x86), который можно выгружать (если поток не находится в состоянии ожидания режима ядра).
Почему так много вещей должны выделять память для потока
Потоки - это наименьший приоритетный блок, который предоставляет ОС, и с ними связано много контекста.Многие различные компоненты должны предоставлять отдельный контекст для каждого потока, потому что системные службы должны иметь возможность работать с несколькими потоками, выполняющими разные действия одновременно.
Некоторые службы требуют, чтобы вы объявляли им новые потоки явно, ноожидается, что большинство из них будут работать с новыми потоками автоматически.Иногда это означает выделение места прямо при запуске потока.Поскольку поток задействует другие службы, объем памяти, используемый для отслеживания потока, может увеличиться, поскольку эти службы устанавливают собственный контекст для потока.
Сколько памяти выделено
Трудно определитьскажем, сколько памяти выделено для потока, так как он распределен по нескольким адресным пространствам и кучам.Она будет варьироваться в зависимости от версии Windows, установленных компонентов и того, что загружено в процесс в настоящее время.
Обычно принято считать, что самая большая стоимость - это 1 МБ адресного пространства, используемого по умолчанию для новых потоков, но даже это ограничение может позволитьмногие сотни будут использоваться в одном процессе без недостатка места.
Если в проекте используется гораздо больше потоков ОС, чем число процессоров в системе, его следует пересмотреть.Рабочие очереди с пулом потоков и легкими потоками с расписанием пользовательского режима с волокнами или реализацией другой библиотеки должны иметь возможность обрабатывать многопоточность, не требуя чрезмерного количества потоков ОС, что делает стоимость памяти потоков неважной.