2013-10-14 4 views
8

Насколько я знаю, перед тем .NET 4.0 все было просто: один процесс может разместить только одну CLR.Есть ли одна управляемая куча для CLR или для процесса?

Но с версии 4.0 процесс может содержать более одной CLR.

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

1) Не могли бы вы подтвердить, что это окончательно имеет дело или оно более тонкое?

2) Являются ли два CLR в одном и том же процессе строго изолированными или могут делиться чем-нибудь? (особенно, если они имеют одинаковую версию, могут ли они знать друг о друге)

Я думаю, что ответы да и да (изолированные), но я хотел бы быть уверен.

Спасибо за понимание.

+0

См http://stackoverflow.com/a/6982447/56778 –

+0

@ JimMischel: Если это от Master Skeet, это должно быть правдой. :) Слишком плохо, что обсуждение, на которое вы указываете, не было правильно помечено, так что я бы его нашел. Я обновил его теги. Спасибо :) – Pragmateek

+0

@JimMischel: остается вопрос изоляции ... :) – Pragmateek

ответ

1

Первое, что нам нужно - это разобраться или карта, что происходит в целом:

вы исполняете свой файл ех -> файл запрашивает .NET CLR -> процесс CLR - хостит выполнение.

Так быть кратким, я нарисую его короче:

Это то, что происходит в предыдущем 4.0:
Выполнить file1.exe -> CLR Process -> хосты (.net File1. exe) => здесь я предполагаю, что file1.exe is .net1
Execute File2.exe -> CLR Process2 -> hosts (.net File2.exe) => здесь я предполагаю, что file2.exe is .net2
Execute File3.exe -> CLR Process3 -> hosts (.net File3.exe) => здесь я предполагаю, что файл3.exe is .net3

В abov например, я предполагаю, что на компьютере установлено .net 3, и именно поэтому .net3 CLR - это процесс - и правда - он был загружен 3 раза! однако, поскольку DLL - это то же самое, DLL-окна могут делиться им так, как будто он был загружен только один раз. но в памяти - на нем используются 3 разных указателя указателя, и каждый процесс имеет свою отдельную кучу.

И это то, что происходит с 4.0 и 4.5:
Выполнить File4.exe -> CLR Process45 -> хосты (.net File4.exe) => здесь я предполагаю, что file4.exe является .net4
Execute file45.exe ->CLR Process45 -> также содержит (.net File45) => здесь я предполагаю, что file45.exe является .net4.5

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

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

Вторая часть моего ответа более релевантна тому, что вы задаете точным:
Любой процесс имеет одну кучу, которая не может быть изменена, так как это работает.
(независимо от того, что может сделать CLR, который является просто другим процессом в этом смысле)
Но для того, чтобы обеспечить кучу на каждом exe, они изобрели концепцию с названием «blob-heap», которая помещается в кучу процесс CLR. так много кучи blob можно управлять сразу.
Каждое размещенное приложение в CLR имеет свой собственный GC, и они изолированы и не знают друг о друге.
Насколько я понимаю, только один CLR используется в .NET4, который может управлять многими хост-элементами или приложениями. Это означает, что многие приложения будут замедлять друг друга в потенциале, но это правда, даже если вместо этого использовался подход «Multi-CLR». Более острая проблема заключается в том, что если бы CLR перестала работать ... все размещенные приложения перестали работать с Это. Я понятия не имею, как или как эта потенциальная проблема решена в архитектуре.

я прочитал из всех этих источников, чтобы собрать этот ответ:
Common Language Runtime (CLR)
ECMA C# and Common Language Infrastructure Standards
Common Language Infrastructure (CLI) Partitions I to VI (6th edition)
In-Process Side-by-Side
Loading multiple CLR Runtimes (InProc SxS) – Sample Code

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