进程、应用程序域和对象上下文
进程简单说就是一个运行的程序,是一个操作系统级别的概念,用来描述一组资源和程序运行所必需的内存分配。一个进程的失败不会影响到其他的进程。
线程是进程中的基本执行单元。进程的入口点创建的第一个线程被称为主线程。 我们可以创建工作者线程来执行强度大的工作,主线程仍然对用户的输入保持响应。这使得整个进程具有更强的性能。但是,如果单个进程中的线程过多的话,性能反而会下降,因为CPU需要花费不少时间在这些活动的线程之间来回切换。
单CPU的计算机并没有能力在同一时间运行多个线程。在一个单位时间(一个时间片)内,单CPU只能根据线程的优先级执行一个线程。当一个线程的时间片用完的时候,它会被挂起,以便执行其他线程。对于线程来说,它们需要在挂起前记住发生了什么,把这些情况写到线程本地存储中,并且他们还要获得一个独立的调用栈。
system.Diagnostics 命名空间定义了许多类型,允许以编程方式访问进程和诊断相关的类型(比如系统事物日志和性能计数器)。
在.net 平台下,可执行程序没有直接承载在windows进程中,而传统非托管程序是直接承载的。 实际上,.net 可执行程序承载在进程的一个逻辑分区中,术语为应用程序域(AppDomain)。可见,一个进程可以包含多个应用程序域,每一个应用程序域中承载一个.net可执行程序。 和一个完整的进程相比,应用程序域的cpu和内存占用都要小的多。因此CLR加载和卸载应用程序域比起完整的进程也就快的多,并且可以快速的提升服务器应用程序的可扩展性。应用程序域为承载的应用程序提供了深度的隔离。如果一个应用程序域失败了,剩余的也能保持正常。
使用上下文,CLR可以确保在运行时有特殊需要的对象,可以通过拦截进出上下文的方法调用,得到适当和一致的处理。这个拦截层允许CLR调整当前的方法调用,以满足给定对象对上下文的设定要求。如果定义一个需要自动线程安全(使用[Synchronization]特性)的C#类类型,CLR将会在分配期间创建"上下文同步"。每个应用程序域都有一个默认的上下文,大多数.net对象都会加载到默认的上下文(context0)中。 如果CLR判断一个新创建的对象有特殊需求,一个新的上下文边界将会在承载的应用程序域中被创建。
不需要指定特定上下文的.net类型称为上下文灵活对象,其构建时,不需要修复类型的上下文特性,也 不需要派生自System.ContextBoundObject基类。 一个上下文敏感的类型除了派生自System.ContextBoundObject外,也可以用特定种类的.net特性修饰,术语称为上下文特性。所有的上下文特性派生自ContextAttribute基类。
一个给定的应用程序域包含一个或多个上下文,使用上下文,CLR能够将“有特殊需要的”对象放置到一个逻辑容器中,确保该对象的运行时需要能够被满足。