Ответ 1
выделенная память 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, загруженные в процесс, будут уведомлены о новом потоке и могут выделять собственную память для отслеживания потока.
Ядро создаст объект ETHREAD
[макет] (полученный от KTHREAD) из ядра non-paged pool для отслеживания состояния потока. Также будет выделен стек ядра (по умолчанию значение 12k для x86), которое может быть выгружено (если поток не находится в состоянии ожидания режима ядра).
Почему так много вещей нужно выделить память для потока
Потоки - это наименьшая предустановленная единица, которую предоставляет ОС, и с ними связано много контекста. Многим различным компонентам необходимо предоставить отдельный контекст для каждого потока, поскольку системные службы должны иметь возможность обрабатывать несколько потоков, выполняющих разные вещи в одно и то же время.
Некоторые службы требуют, чтобы вы объявляли новые потоки явно, но большинство из них, как ожидается, будут работать с новыми потоками автоматически. Иногда это означает выделение пространства при запуске потока. Поскольку поток взаимодействует с другими службами, объем памяти, используемый для отслеживания потока, может увеличиваться, поскольку эти службы настраивают свой собственный контекст для потока.
Сколько выделено памяти
Трудно сказать, сколько памяти выделено для потока, поскольку оно распространяется по нескольким адресным пространствам и кучам. Он будет варьироваться в зависимости от версий Windows, установленных компонентов и того, что загружено в текущий процесс.
Самая большая стоимость обычно считается 1 МБ адресного пространства, используемого по умолчанию для новых потоков, но даже этот предел позволяет многосот использовать в одном процессе без пробега.
Если в проекте используется гораздо больше потоков ОС, чем количество процессоров в системе, его следует пересмотреть. Рабочие очереди с пулом потоков и легкими потоками с планированием режима пользователя с помощью волокон или другой реализации библиотеки должны иметь возможность обрабатывать многопоточность, не требуя чрезмерного количества потоков ОС, делая стоимость памяти для потоков неважной.