AppDomain ,汇编,流程和主题之间有什么区别?
答案 0 :(得分:51)
AppDomain是进程中的隔离单元。 AppDomains可以在运行时创建,加载代码并卸载。它是一个隔离边界,旨在使.NET应用程序更可靠。
程序集包含一个或多个模块,这些模块保存已编译的代码块。您通常会将程序集视为.EXE或.DLL。
进程是一个正在执行的应用程序(waaaay过度简化)。
线程是执行上下文。操作系统在线程内执行代码。操作系统在线程之间切换,允许每个线程依次执行,从而给人以多个应用程序同时运行的印象。
把它们放在一起(非常简化)......
执行程序。一个进程由操作系统创建,并在其单个线程中开始加载要执行的代码。在.NET应用程序中,CLR会创建一个AppDomain。应用程序的执行程序集(.EXE)将加载到此AppDomain中并开始执行。应用程序可以生成新进程,创建AppDomains,将其他程序集加载到这些域中,然后创建新的线程以在任何这些AppDomain中执行代码。
答案 1 :(得分:12)
CLR的JIT编译器的一大优势是 - 它可以防止进程的虚拟地址空间重叠。例如,如果生成进程1并且CLR(MScorEE.dll)正在该进程中管理托管程序集(.exe或.dll)的执行,那么JIT编译器将确保分配给此进程的虚拟地址空间进程不会与其他相邻进程冲突或重叠。有了这个优势,现在可以将单个进程重用于多个托管代码执行!每个托管代码执行都有自己的AppDomain,而且AppDomains可能只是单个进程的一部分。这是IIS和SQL Server使用的(单个进程,许多AppDomain)。
Assembly是一个抽象术语,表示托管代码的单个可重用组件。程序集由元数据(PE32或PE32 +标头+ IL标头)和IL指令组成。 CLR的JIT编译器根据处理器及其架构(x86或x64)编译并将装配的IL转换为机器特定的指令集。
进程是操作系统用来促进程序执行的过程。进程是程序的“RAM表示”,其具有由堆栈,堆,静态和代码区域组成的地址空间。每个流程都有一个与之关联的唯一流程ID。
线程是一个轻量级的过程。进程具有至少一个线程(即主线程)并且取决于并行性OS可以在单个进程内创建多个线程并且在它们之间进行上下文切换以支持更快的程序执行。线程可以在进程内共享一些内存区域。