AppDomain、Assembly、Process和Thread之间的区别

52
AppDomainAssemblyProcessThread之间的区别是什么?
2个回答

66

AppDomain是进程内的隔离单元。可以在运行时创建、加载代码和卸载。它是一个隔离边界,旨在使.NET应用程序更加可靠。

程序集包含一个或多个模块,这些模块包含编译好的代码块。通常情况下,您会将程序集视为.EXE或.DLL文件。

进程是一个正在执行的应用程序(非常简化)。

线程是一个执行上下文。操作系统在线程中执行代码。操作系统在线程之间切换,允许每个线程依次执行,从而给人一种多个应用程序同时运行的印象。

将所有内容(非常简化)放在一起...

程序被执行。操作系统创建了一个进程,在其单个线程中开始加载要执行的代码。在.NET应用程序中,CLR创建了一个单独的AppDomain。应用程序的执行程序集(.EXE)被加载到此AppDomain中并开始执行。应用程序可以生成新进程,创建AppDomains,将其他程序集加载到这些域中,然后创建新线程以在任何这些AppDomains中执行代码。


3
从技术上讲,汇编是一个组件,由一个或多个模块组成。这些模块是 .EXE 或 .DLL 文件。 - Dave Van den Eynde
2
没错,你可以将模块合并成一个单独的程序集。这只是我留下的众多细节之一! - user1228
当你把它们放在一起时,“操作系统创建进程”和“应用程序可以生成新进程”的区别是什么? - variable
@variable 程序是编译后的可执行文件,存储在磁盘上。进程是操作系统在将可执行文件加载到内存并开始执行其代码时创建的内容。 - user1228
那么,当运行 .Net 应用程序时,可以说操作系统启动了一个进程。在这个进程中,它的主线程运行着 CLR 的一个实例。在这个 CLR 实例中,创建了一个 AppDomain。.Net dll 或 exe 在这个 AppDomain 中运行。正确吗? - user20358
@user20358 差不多了。如果你想了解它的实际工作原理,立即去获取CLR Via C#的副本。我强烈推荐它。 - user1228

18
CLR的JIT编译器最大的优势之一是,它可以防止进程的虚拟地址空间重叠。例如,如果生成进程1并且CLR(MScorEE.dll)正在管理该进程中托管程序集(.exe或.dll)的执行,则JIT编译器将确保为此进程分配的虚拟地址空间不会与其他相邻进程发生冲突或重叠。有了这个优势,现在可以重复使用单个进程来执行多个托管代码!每个托管代码执行都有自己的AppDomain,而多个AppDomains可以成为单个进程的一部分。这就是IIS和SQL Server使用的方法(单个进程,多个AppDomains)。
程序集是表示托管代码的一个可重用组件的抽象术语。程序集由元数据(PE32或PE32+头+IL头)和IL指令组成。CLR的JIT编译器将程序集的IL编译并转换为基于处理器及其架构(x86或x64)的机器特定指令集。
进程是操作系统用来促进程序执行的一种方式。进程是程序的“RAM表示”,具有堆栈、堆、静态和代码区域组成的地址空间。每个进程都有一个唯一的进程ID与之关联。
线程是轻量级进程。一个进程至少有一个线程(即主线程),根据并行性,操作系统可以在一个进程中创建多个线程,并在它们之间进行上下文切换,以支持更快的程序执行。线程可以共享一些内存区域。

1
更正:线程通常不共享堆栈。如果它们真的想要,它们可以读取/修改彼此的堆栈,但一般来说,每个线程都有自己的堆栈。我已经从您的帖子中删除了那个措辞。请重新检查是否符合您的意思。 - quetzalcoatl
我同意。线程有它们自己的堆栈。谢谢您的纠正。 - IntelligentBinary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接