C#2008与.NET 3.5 高级程序设计读书笔记(17)-- 进程、应用程序域和对象上下文
1.进程
进程是一个术语,用来描述一组资源(比如外部代码库和主线程)和程序运行所必需的内存分配.对于每个被加载到内存的*.exe,在它的生命周期中操作系统会为之创建一个单独且隔离的进程.
2.线程
线程是Win32进程独立的独立执行单元,每一个进程都有一个(在可执行入口点创建的)主线程,并且每个进程还可以包含以编程方式创建的额外线程.
3.应用程序域(AppDomain)
在以前传统的开发中我们都知道,一个应用程序对应一个进程,并为该进程指定虚拟内存,由操作系统来映射实际的物理内存,有效的维护了进程之间的安全性。但另一方面,每一个进程都会消耗一定的系统资源,降低了性能,并且进程间的通信也比较麻烦。
在.Net中推出了一个新的概念:应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中,可以降低系统消耗,同时不同的域之间互相隔离,在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点。
应用程序域是.NET 运行库的逻辑进程表示,操作系统进程可以包含多个应用程序域。应用程序域具有下列优点:
(1)、隐藏了进程具体的操作系统信息。从而允许把.NET 放在不同的操作系统下。
(2)、提供了隔离。即使运行在同一个进程中的属于不同域的应用程序也不能直接共享全局数据、静态数据或其他资源。所以,一个应用程序域失败了,也不会影响到同一个进程中的其他应用程序域。
(3)、对于不需要昂贵的 IPC 机制的进程,应用程序域允许 .NET 运行库优化运行在这种进程中的应用程序间的通信。
因为应用程序域是被隔离的,所有.NET 对象都会被界定在创建它的应用程序域内。如果跨应用程序域的边界传递对象引用,该被引用对象就被称为远程对象。
4.对象上下文
应用程序域是承载.NET程序集的进程的逻辑分区。与此相似,应用程序域也可以进一步被划分为多个上下文边界(context boundary)。事实上,.NET上下文为单独的应用程序域提供了一种方式,该方式能为一个给定对象建立“特定的家”(specific home)。
使用上下文,CLR可以确保在运行时有特殊需求的对象,可以通过拦截进出上下文的方法调用,得到适当的和一致的处理。这个拦截层允许CLR调整当前的方法调用,以便满足给定上下文的设定要求。比如,如果定义一个C#类型需要自动线程安全(使用【Synchronization】特性),CLR将会在分配期间创建“上下文同步”。