进程,线程,应用程序域,程序集,托管
进程
定义:可并发执行的程序在一个数据集合上的运行过程,每个进程有一个自己的地址空间以及一个单一的控制流程。
要解决的问题:为了使程序能并发执行,(要并发执行就要隔离进程,使进程独立,即每个进程有属于自己的数据段、程序段、进程控制块)
进程是一个资源拥有者,拥有自己的数据段,程序段,进程控制块,因为在创建,撤销和切换过程中,系统必须付出较大的开销,所以有了appDomain.
AppDomain:系统只提供进程,Process只提供了对内存的控制,所以.Net无法直接在Process中运行,所以有了AppDomain.
托管:托管的代码不可以直接写内存,所以是安全的。
非托管:非托管的代码可以直接读写内存,不安全,但效率高,像C++中的指针。
线程
出现的背景:由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高。
要解决的问题:解决进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销的问题
解决的方法:将进程的两个属性分开,由操作系统分开处理。把“独立调度、分配的基本单位”这个属性分离出来作为线程;而把进程作为资源拥有的基本单位,线程作为进程中的一个实体而存在。
线程:CLR执行代码的操作系统的构造,在运行时,所有的托管代码都加载到一个AppDomain中,由特定的操作系统线程来运行。线程可以自由的跨越应用程序的边界,而不为每个appdomain创建新的线程。在特定的时间内,每个线程都在一个appdomain中运行,CLR会跟踪在那些appdomain中有那些线程。
单独的库程序集是不能被直接运行的(库程序集即.dll的文件),它必须和一个可执行程序集文件一起启动(可执行程序集即.exe)。当可执行文件加载完毕时,.NET会在当前进程中创建一个应用程序域称为默认域,域的名称和程序集的名称相同,它不能被销毁直至进程销毁。
appdomain与线程的关系:appdomain与线程并不是一对一的关系,单个appdomain中可以执行多个线程,而线程可以跨越appdomain的边界。
所以,这些不同的appdomain之间只能通过远程通讯来实现消息和对象的传递。
线程可以再不影响进程的情况下停止单个的appdomain。
线程为了减少程序并发执行所付出的时空开销,一个线程可以创建和撤销另一个线程。
http://www.cnblogs.com/baixiaoxu/news/2011/03/28/2024018.html
http://www.cnblogs.com/mapk/archive/2008/01/26/1041919.html
http://www.cnblogs.com/prime/archive/2010/03/02/Threading_Basics_2.html