2013-10-14 79 views
8

據我所知,之前.NET 4.0事情很簡單:一個進程只能託管一個CLR每個CLR或每個進程是否有一個託管堆?

但是從4.0版本開始,一個進程可以託管多個CLR。因爲每個CLR都有自己的狀態和自己的GC,以自己的方式管理內存和自己的收集週期,所以共享內存似乎是不可能的。

1)你能證實這確實是這種情況還是更微妙?

2)兩個CLR在同一個進程中託管是嚴格隔離還是可以共享任何內容? (特別是如果他們有相同的版本,他們可能會意識到彼此)

我想答案是肯定的,是(孤立的),但我想確定。

感謝您的任何見解。

+0

見http://stackoverflow.com/a/6982447/56778 –

+0

@ JimMischel:如果這是來自Skeet大師,它肯定是真的。 :)你指向的討論太糟糕了,沒有被正確標記,所以我會找到它。我更新了它的標籤。謝謝:) – Pragmateek

+0

@JimMischel:仍然是隔離問題... :) – Pragmateek

回答

1

我們需要的第一件事情 - 就是理清或地圖正在發生的事情在一般:

您執行exe文件 - >文件要求一個.NET CLR - > CLR的過程 - 你的主機執行。

所以要簡短,我就畫更短:

這是在以前發生的事情,以4.0:
執行File1.exe - > CLR過程 - >主機(.NET文件1。 EXE)=>這裏我假設file1.exe是.net1
執行File2.exe - > CLR Process2 - > hosts(.net File2.exe)=>這裏我假設file2.exe是.net2
執行File3.exe - > CLR Process3 - > hosts(.net File3.exe)=>這裏我假設file3.exe是.net3

在abov我假設的例子.net 3安裝在機器上,這就是爲什麼.net3 CLR是過程 - 真實 - 它被加載了3次!然而,由於DLL是相同的DLL窗口可能會共享它,使得它只是加載一次。但在內存中 - 它使用了3個不同的指令指針,每個進程都有自己獨立的堆。

這是4.0和4.5發生了什麼:
執行File4.exe - > CLR Process45 - >主機(.NET File4.exe)=>在這裏我想file4.exe是.NET4
執行file45.exe - >CLR Process45 - >也承載(.NET File45)=>這裏我假定file45.exe是.net4.5

在上述例子中我假定達網絡45被安裝在機器上,所以.net CLR4是隻加載一次的過程(而不是兩次!正如前面例子邏輯所期望的那樣)

您可以在我的答案末尾提供的鏈接中瞭解更多信息,以瞭解哪些版本可以「坐在」在一起 - 並非所有版本都可以與所有版本並排放置。

我的回答的第二部分與您所要求的確切關聯性更高:
任何進程都有一個堆 - 由於它是硬件的工作方式,因此無法更改。
(不管CLR哪個只是另一個過程在這個意義上可以做到的)
但是爲了能夠提供一個每個exe被託管的堆,他們發明了一個名爲「blob-heap」的概念,它被放置在堆CLR流程。可以一次管理很多blob堆。
CLR中的每個託管應用程序都有其自己的GC,它們是隔離的,彼此不知道。
據我瞭解,在.NET4中只能使用一個CLR,能夠管理許多主機項目或應用程序。這意味着許多應用程序將潛在地放慢彼此的速度,但即使使用「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

相關問題