进程,线程,应用程序。概念理解
2010-07-24 18:21
302 查看
简单的说,进程可以承载一组相关的.NET程序集,而应用程序域(简称AppDomain)是对该进程的逻辑细分。一个应用程序域进一步被细分成多个上下文边界,这些边界用来分组目的相似的.NET对象。使用上下文的概念,CLR便能够确保恰当地控制那些带特殊运行时要求的对象。
传统的进程
用来描述一组资源和程序运行所必需的内存分配。对于每个被加载到内存的可执行程序,在她的生命周期中操作系统会为之单独且隔离的进程。由于一个进程的失败不会影响其他的进程,使用这种方式,运行库环境将更加稳定。
通过任务管理器,我们可以查看机器上正在运行进程的统计信息:进程的标示符(PID)以及映像名称。
进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
线程概述
线程是进程中的基本执行单元(a path of execution)。进程的入口点创建的第一个线程为主线程。仅仅包含一个主线程的进程是线程安全的。但是,单线程的应用程序用户响应不好。
开发者使用多线程,有助于改善程序的总体响应。Win32 API可以让主线程使用如CreateThread()之类的函数,另外产生次线程。每个线程都是进程中的一个独立执行单元(unique of execution)。比如:一个应用程序可以产生一个工作线程来执行强度大的工作(比如传输大文件),当这个次线程正在忙碌的时候,主线程仍然可以对用户的输入保持响应。
当然,如果单个进程中的线程过多的话,性能反而会下降,因为CPU需要花不少时间在这些活动线程的来回切换上。另外,单CPU的计算机并没有能力同一时间运行多个线程。当一个县城的时间片用完的时候,他会被挂起(suspended),以便执行其他的线程。(找详细点的资料)
如果觉得太复杂,那么只需要记住:线程是Win32进程的独立执行的单元,每一个进程都有一个主线程,并且每个进程还可以以编程的方式创建额外的线程。更多内容可以参考:关于进程和线程『整理』 、 复习功课:对进程、线程、应用程序域的理解
.NET平台下与进程进行交互
.NET的基类库可以方便的和进程进行交互。他们位于System.Diagnostics命名空间中,该空间定义了许多的类型,允许我们与系统进程、事件日志和性能计数器进行交互。
我们可以看到,与进程打交道的类型有:Process、ProcessModule、ProcessModuleCollection、ProcessStartInfo、ProcessThread、ProcessThreadCollection。
详细的关于Process使用方法可以查阅MSDN,比如获取/设置进程优先级,获取进程打开的句柄数。
.NET应用程序域
.NET平台下,程序集并没有直接加载进进程中(传统的Win32程序是直接承载的)。.NET可执行程序承载在进程的一个逻辑分区中,术语称应用程序域(简称AppDomain)。一个进程可以拥有多个应用程序域,应用程序域的全部目的就是提供隔离性,相比较与传统的:
1.应用程序域是.NET平台操作系统独立性的关键特性。这种逻辑分区将不同操作系统表现加载可执行程序的差异抽象化了。
2.和一个完整的进程相比,应用程序域的CPU和内存占用要小的多。
3.应用程序域为承载的应用程序提供了深度的隔离。一个失败,其他不会失败。
单个进程可以承载多个应用程序域,每个程序域都和该进程的其他程序域隔离开来,无法相互访问。在线程启动的时候,CLR将自动创建这个特定的应用程序域(默认应用程序域)。然后根据需要创建其他程序域。
两边都有mscorlib.dll,因为所有关键程序集会被CLR自动加载到每一个应用程序域中。
更多内容:C#强化系列文章六:应用程序域(AppDomain)浅析 、寄宿(host)和应用程序域(appdomain)
对象上下文
应用程序域是承载.NET程序集的进程的逻辑分区。与此相似,应用程序域也可以进一步被划分为多个上下文边界(context boundary)。事实上,.NET上下文为单独的应用程序域提供了一种方式,该方式能为一个给定对象建立“特定的家”(specific home)。
使用上下文,CLR可以确保在运行时有特殊需求的对象,可以通过拦截进出上下文的方法调用,得到适当的和一致的处理。这个拦截层允许CLR调整当前的方法调用,以便满足给定上下文的设定要求。比如,如果定义一个C#类型需要自动线程安全(使用【Synchronization】特性),CLR将会在分配期间创建“上下文同步”。
和一个进程定义了默认的应用程序域一样,每一个应用程序域都有一个默认的上下文(context 0)。大多数.NET对象都会被加载到上下文0中。如果CLR判断一个新创建的对象有特殊需求,一个新的上下文边界将会在承载它的应用程序域中被创建。
可以通过Thread.CurrentContext获得上下文,通过context的ContextProperties属性获得描述。
Code
// 得到上下文并输出ID
Context ctx = Thread.CurrentContext;
Console.WriteLine("{0} object in context {1}",
this.ToString(), ctx.ContextID);
foreach (IContextProperty itfCtxProp in ctx.ContextProperties)
Console.WriteLine("-> Ctx Prop: {0}", itfCtxProp.Name);
1.一个.NET进程可以承载多个应用程序域。每一个应用程序域可以承载多个相关的.NET程序集,并且可以由CLR(或者AppDomain)独立地加载或卸载应用程序域。
2.一个给定的应用程序域中包含一个或多个上下文。使用上下文,CLR能够将“由特殊需求的”对象放置到一个逻辑容器中,确保该对象的运行时需求能够被满足。
程序集
一个.NET应用程序可以由多个程序集拼装而成的。程序集,简单来说,就是一个以公共语言运行库(CLR)为宿主的、版本化的、自描述的二进制文件。尽管显示中.NET程序集和以往Win32二进制文件(包括遗留的COM服务对象)的文件扩展名(*.exe或*.dll)完全相同,但是两者的内部构成几乎完全不同。
程序集可以促进代码重用、确定类型边界、可版本化的单元、自描述的、可配置的。
.NET程序集的格式
n Win32文件首部
Win32文件首部使程序集可以被Windows系列操作系统加载和操作。使用dumpbin.exe结合/headers标记打开一个.NET程序集,可以浏览该程序集的Win32文件首部信息。
总结
n CLR文件首部
为了驻留于CLR中,所有的.NET文件都必须还有CLR首部数据块。它定义了多个标记,它们使得运行库可以了解到托管文件的布局。例如,文件中元数据和资源的位置、程序集构建的运行库版本、公钥值等。使用dumpbin.exe结合/clrheader。
n CIL代码
程序集的核心部分包含CIL代码,这些CIL代码是独立于平台和CPU的中间语言。运行时,程序集内部的CIL代码才被编译成特定平台和CPU的指令。
n 类型元数据
传统的进程
用来描述一组资源和程序运行所必需的内存分配。对于每个被加载到内存的可执行程序,在她的生命周期中操作系统会为之单独且隔离的进程。由于一个进程的失败不会影响其他的进程,使用这种方式,运行库环境将更加稳定。
通过任务管理器,我们可以查看机器上正在运行进程的统计信息:进程的标示符(PID)以及映像名称。
进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。
线程概述
线程是进程中的基本执行单元(a path of execution)。进程的入口点创建的第一个线程为主线程。仅仅包含一个主线程的进程是线程安全的。但是,单线程的应用程序用户响应不好。
开发者使用多线程,有助于改善程序的总体响应。Win32 API可以让主线程使用如CreateThread()之类的函数,另外产生次线程。每个线程都是进程中的一个独立执行单元(unique of execution)。比如:一个应用程序可以产生一个工作线程来执行强度大的工作(比如传输大文件),当这个次线程正在忙碌的时候,主线程仍然可以对用户的输入保持响应。
当然,如果单个进程中的线程过多的话,性能反而会下降,因为CPU需要花不少时间在这些活动线程的来回切换上。另外,单CPU的计算机并没有能力同一时间运行多个线程。当一个县城的时间片用完的时候,他会被挂起(suspended),以便执行其他的线程。(找详细点的资料)
如果觉得太复杂,那么只需要记住:线程是Win32进程的独立执行的单元,每一个进程都有一个主线程,并且每个进程还可以以编程的方式创建额外的线程。更多内容可以参考:关于进程和线程『整理』 、 复习功课:对进程、线程、应用程序域的理解
.NET平台下与进程进行交互
.NET的基类库可以方便的和进程进行交互。他们位于System.Diagnostics命名空间中,该空间定义了许多的类型,允许我们与系统进程、事件日志和性能计数器进行交互。
我们可以看到,与进程打交道的类型有:Process、ProcessModule、ProcessModuleCollection、ProcessStartInfo、ProcessThread、ProcessThreadCollection。
详细的关于Process使用方法可以查阅MSDN,比如获取/设置进程优先级,获取进程打开的句柄数。
.NET应用程序域
.NET平台下,程序集并没有直接加载进进程中(传统的Win32程序是直接承载的)。.NET可执行程序承载在进程的一个逻辑分区中,术语称应用程序域(简称AppDomain)。一个进程可以拥有多个应用程序域,应用程序域的全部目的就是提供隔离性,相比较与传统的:
1.应用程序域是.NET平台操作系统独立性的关键特性。这种逻辑分区将不同操作系统表现加载可执行程序的差异抽象化了。
2.和一个完整的进程相比,应用程序域的CPU和内存占用要小的多。
3.应用程序域为承载的应用程序提供了深度的隔离。一个失败,其他不会失败。
单个进程可以承载多个应用程序域,每个程序域都和该进程的其他程序域隔离开来,无法相互访问。在线程启动的时候,CLR将自动创建这个特定的应用程序域(默认应用程序域)。然后根据需要创建其他程序域。
两边都有mscorlib.dll,因为所有关键程序集会被CLR自动加载到每一个应用程序域中。
更多内容:C#强化系列文章六:应用程序域(AppDomain)浅析 、寄宿(host)和应用程序域(appdomain)
对象上下文
应用程序域是承载.NET程序集的进程的逻辑分区。与此相似,应用程序域也可以进一步被划分为多个上下文边界(context boundary)。事实上,.NET上下文为单独的应用程序域提供了一种方式,该方式能为一个给定对象建立“特定的家”(specific home)。
使用上下文,CLR可以确保在运行时有特殊需求的对象,可以通过拦截进出上下文的方法调用,得到适当的和一致的处理。这个拦截层允许CLR调整当前的方法调用,以便满足给定上下文的设定要求。比如,如果定义一个C#类型需要自动线程安全(使用【Synchronization】特性),CLR将会在分配期间创建“上下文同步”。
和一个进程定义了默认的应用程序域一样,每一个应用程序域都有一个默认的上下文(context 0)。大多数.NET对象都会被加载到上下文0中。如果CLR判断一个新创建的对象有特殊需求,一个新的上下文边界将会在承载它的应用程序域中被创建。
可以通过Thread.CurrentContext获得上下文,通过context的ContextProperties属性获得描述。
Code
// 得到上下文并输出ID
Context ctx = Thread.CurrentContext;
Console.WriteLine("{0} object in context {1}",
this.ToString(), ctx.ContextID);
foreach (IContextProperty itfCtxProp in ctx.ContextProperties)
Console.WriteLine("-> Ctx Prop: {0}", itfCtxProp.Name);
1.一个.NET进程可以承载多个应用程序域。每一个应用程序域可以承载多个相关的.NET程序集,并且可以由CLR(或者AppDomain)独立地加载或卸载应用程序域。
2.一个给定的应用程序域中包含一个或多个上下文。使用上下文,CLR能够将“由特殊需求的”对象放置到一个逻辑容器中,确保该对象的运行时需求能够被满足。
程序集
一个.NET应用程序可以由多个程序集拼装而成的。程序集,简单来说,就是一个以公共语言运行库(CLR)为宿主的、版本化的、自描述的二进制文件。尽管显示中.NET程序集和以往Win32二进制文件(包括遗留的COM服务对象)的文件扩展名(*.exe或*.dll)完全相同,但是两者的内部构成几乎完全不同。
程序集可以促进代码重用、确定类型边界、可版本化的单元、自描述的、可配置的。
.NET程序集的格式
n Win32文件首部
Win32文件首部使程序集可以被Windows系列操作系统加载和操作。使用dumpbin.exe结合/headers标记打开一个.NET程序集,可以浏览该程序集的Win32文件首部信息。
总结
n CLR文件首部
为了驻留于CLR中,所有的.NET文件都必须还有CLR首部数据块。它定义了多个标记,它们使得运行库可以了解到托管文件的布局。例如,文件中元数据和资源的位置、程序集构建的运行库版本、公钥值等。使用dumpbin.exe结合/clrheader。
n CIL代码
程序集的核心部分包含CIL代码,这些CIL代码是独立于平台和CPU的中间语言。运行时,程序集内部的CIL代码才被编译成特定平台和CPU的指令。
n 类型元数据
相关文章推荐
- 进程,线程,应用程序。概念理解
- 进程,线程,应用程序。概念理解2
- 线程、进程 概念理解
- 关于程序,进程,线程。程序个人理解:应用程序是一个车间,进程是一条生产线,线程是机器
- 理解进程,线程概念
- 进程和线程基本概念的理解
- 理解Linux中进程,线程等概念
- 进程、线程、协程之概念理解
- 进程、线程、协程基本概念理解
- 如何更直观理解进程、线程、事务的概念
- 进程与线程的区别(概念理解)
- 线程进程Java多线程(一)、理解进程与多线程的概念及关系
- 进程 线程 协程 管程 纤程 概念对比理解
- Java中线程和进程的一些概念的理解
- 内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程)
- 进程和线程的概念
- 线程和进程的深入理解(通俗易懂版)
- Windows内核原理与实现--Windows进程线程基本概念(2)
- 进程、线程、并发执行的概念
- 进程和线程的概念