2015-06-15html
1 进程
1.1 四个基本特征
1.2 进程的出现
1.3 进程的定义和特征
1.4 关于进程的总结
2 线程
2.1 线程的出现
2.2 关于线程的总结
3 应用程序域(AppDomain)
3.1 应用程序域的出现
3.2 域与线程的关系
3.3 示例:在另外一个应用程序域中执行代码
参考:安全
返回并发
进程由操做系统建立、管理的,离开了操做系统也就不谈什么进程了,先看看操做系统的四个基本特征:异步
并行性是指两个或者多个事件在同一时刻发生,这是一个具备微观意义的概念,即在物理上这些事件是同时发生的;而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。async
在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。应当指出,一般的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每一个程序创建进程。进程,又称任务,简单来讲,是指在系统中能独立运行并做为资源分配的基本单位,它是一个活动的实体。多个进程之间能够并发执行和交换信息。一个进程在运行时须要运行时须要必定的资源,如 cpu,存储空间,及i/o设备等。在操做系统中引入进程的目的是使程序能并发执行。性能
所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。因为资源的属性不一样,故多个进程对资源的共享方式也不一样,能够分为:互斥共享方式 和 同时访问方式spa
是指经过技术吧一个物理实体变成若干个逻辑上的对应物。在操做系统中虚拟的实现主要是经过分时的使用方法。显然,若是n是某一个物理设备所对应的虚拟逻辑设备数,则虚拟设备的速度必然是物理设备速度的1/n。操作系统
在多道程序设计环境下,容许多个进程并发执行,因为资源等因素的限制,一般,进程的执行并不是“一鼓作气”,而是以“走走停停”的方式运行。内存中每一个进程在什么时候执行,什么时候暂停,以怎样的方式向前推动,每道程序总共须要多少时间才能完成,都是不可预知的。或者说,进程是以异步的方式运行的。尽管如此,但只要运行环境相同,做业通过屡次运行,都会得到彻底相同的结果,所以,异步运行方式是容许的。.net
操做系统为了使程序并发执行而产生了进程。
进程的定义:可并发执行的程序在一个数据集合上的运行过程。
进程的特征:
咱们首先回顾进程的两个基本属性:
正是因为这两个基本属性,才使进程成为一个能独立运行的基本单位,从而构成了进程并发执行的基础。
因为进程是一个资源的拥有者,于是在进程的建立、撤销、和切换的过程当中,系统必须为之付出较大的时空开销。为了解决这个问题,很多操做系统的学者们想到:将进程的两个属性分开,由操做系统分开处理。即对做为调度和分派的基本单位,不一样时做为独立分配资源的单位,以使之轻装运行;而对拥有资源的基本单位,又不频繁地对之进行切换,在这种思想的指导下,产生了线程的概念。
线程引入的缘由: 为了减小程序并发执行所付出的时空开销,使os具备更好的并发性。
在引入线程的os 中,线程是进程中的一个实体(进程中的一个或多个指令执行流),是被系统独立调度和分派的基本单位。线程基本上再也不拥有系统资源,(只拥有一点在运行中必不可少的资源,如程序计数器、寄存器和栈),但它可与同属一个进程的其余线程功能共享进程所拥有的所有资源。线一个线程能够建立和撤销另外一个线程;同一进程中的多个线程之间能够并发执行。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的所有资源。一个线程能够建立和撤消另外一个线程,同一进程中的多个线程之间能够并发执行。因为线程之间的相互制约,导致线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
在.Net中,应用程序有了一个新的边界:应用程序域(如下简称域)。它是一个用于隔离应用程序的虚拟边界。在.net出现之前,一个进程下,只能运行一个应用程序,而在,net出现后,一个进程下,能够运行多个应用程序,这都是由于应用程序域的出现。
.Net结构中,因为公共语言运行库可以验证代码是否为类型安全的代码,因此它能够提供与进程边界同样大的隔离级别,其性能开销也要低得多。
在.Net中,线程是公共语言运行库用来执行代码的操做系统构造。在运行时,全部托管代码均加载到一个域中,由特定的操做系统线程来运行。然而,域和线程之间并不具备一一对应关系。在任意给定时间,单个域中能够执行不止一个线程,并且特定线程也并不局限在单个域内。也就是说,线程能够跨越域边界,不为每一个域建立新线程。固然,在指定时刻,每一线程都只能在一个域中执行。运行库会跟踪全部域中有哪些线程正在运行。经过调用.Net类库的 Thread.GetDomain 方法,你还能够肯定正在执行的线程所在的域。
若是但愿将该程序集加载到另一个应用程序域中,可使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用这些方法的其余重载版本之一,参考在另外一个应用程序域中执行代码(C# 编程指南)。
若是想从默认入口点之外的位置执行另外一个程序集,可在远程程序集中定义一个从 MarshalByRefObject 派生的新类型。而后在应用程序中使用 CreateInstance 建立该类型的一个实例,参考跨越AppDomain边界访问对象。