AppDomain,進程,線程

在操作系統中,我們知道進程及線程的含義。通俗一點講,進程就是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分爲系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;用戶進程就是所有由你啓動的進程。進程是操作系統進行資源分配的單位。 
    在Windows下,進程又被細化爲線程,也就是一個進程下有多個能獨立運行的更小的單位。
然而在.net 平臺上又引入了一個AppDomain的概念。他跟操作系統中的進程有點類似,但是相對應的你的程序就相當於一個操作系統的感覺了(儘管他肯定不是)。
就包含性概念來說:AppDomain同進程屬於多對一的關係,即一個進程中可以有多個appDomain,但是appDomain只能存在於某個進程中。缺省情況下,如果你沒有自己創建多個appDomain,一個進程啓動後自動創建一個appDomain。而線程執行可以涉及多個appDomain,但某個特定時刻,線程僅存在於一個appDomain中,且線程可以進入其他的appDomain。某個程序集的某個實例屬於具體的appDomain,由appDomain在自己的範圍內加載,並按照程序集創建相應的對象。AppDomain是程序集的執行環境,同時程序集作爲靜態實體,可以被多個appDomain加載執行。

 

 

  在.NET平臺下,程序集並沒有直接承載在進程中(而傳統的win32程序是直接承載的)。實際上.NET可執行程序承載在進程的一個邏輯分區中,術語稱爲應用程序域(也稱AppDomain)。可見,一個進程可以包含多個應用程序域,每一個應用程序域中承載一個.NET可執行程序,這樣的好處如下:
    應用程序域是.NET平臺操作系統獨立性的關鍵特性。這種邏輯分區將不同操作系統加載可執行程序的差異抽象化了。
    和一個完整的進程相比,應用程序域的CPU和內存佔用要小的多。因此CLR加載和卸載應用程序域比起完整的進程來說也快的多。
    應用程序域爲承載的應用程序提供了深度隔離。如果進程中一個應用程序域失敗了,其他的應用程序域也能保持正常。

    AppDomain的主要成員:
    CreateDomain():該靜態方法在當前進程中創建一個新的應用程序域。由於CLR能夠根據需要創建應用程序域,所以必須調用這個方法的機會很少。
    GetCurrentThreadId():該靜態方法返回當前應用程序域上活動的線程ID。
    UnLoad():該靜態方法在進程中卸載指定的應用程序域。
    BaseDirectory:獲取基目錄,該目錄用於探測相關的程序集。
    CreateInstance():在指定程序集文件中創建指定類型的新實例。
    ExecuteAssembly():根據文件名在應用程序域中執行程序集。
    GetAssemblies():獲取已加載到此應用程序域中的.NET程序集(基於COM和C的二進制文件除外)。
    Load():動態加載程序集到當前應用程序域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章