управление стеками в CLR - PullRequest
2 голосов
/ 05 марта 2011

Я понимаю базовую концепцию стека и кучи, но отлично, если any1 может решить следующие проблемы:

  1. Существует ли один стек для всего процесса приложения или для каждого потока, начинающегося в проектесоздан новый стек?

  2. Существует ли одна куча для всего процесса приложения или для каждого потока, начинающегося в проекте, создается новый стек?

  3. Если стек создается для каждого потока, то как процесс управляет последовательным потоком потоков (и, следовательно, стеков)

Ответы [ 3 ]

4 голосов
/ 05 марта 2011
  1. Существует отдельный стек для каждого потока. Это верно не только для CLR, и не только для Windows, но в значительной степени для каждой ОС или платформы.

  2. Существует одна куча для каждого домена приложения. Один процесс может запускать несколько доменов приложений одновременно. Один домен приложения может выполнять несколько потоков.
    Чтобы быть более точным, обычно существует две кучи на домен: одна обычная и одна для действительно больших объектов (например, для массива 64 КБ).

  3. Я не понимаю, что вы подразумеваете под "последовательным потоком потоков".

4 голосов
/ 05 марта 2011

Один стек для каждого потока, все потоки имеют одинаковые кучи.

Нет «последовательного потока» потоков. Поток - это объект операционной системы, в котором хранится копия состояния процессора. Состояние процессора включает в себя значения регистра. Одним из них является ESP, указатель стека. Другим действительно важным является EIP, указатель инструкций. Когда операционная система переключается между потоками, она сохраняет состояние процессора в текущем объекте потока и перезагружает состояние из объекта потока для потока, который был выбран для запуска следующим. Процессор теперь просто продолжает работать с того места, где он остановился ранее.

Начало темы, возможно, теперь легко понять. Операционная система выделяет мегабайт памяти для стека. И инициализирует значение регистра ESP для указания на эту память. И устанавливает значение регистра EIP равным адресу метода, с которого должен начать выполняться поток. Значение делегата ThreadStart в C #.

0 голосов
/ 05 марта 2011

Каждый поток должен иметь свой собственный стек, где хранятся локальные переменные и параметры, а также адреса возврата предыдущих функций.

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