进程、线程与应用程序域

进程、线程与应用程序域

 

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 示例:在另外一个应用程序域中执行代码
参考:安全

1 进程


 返回并发

1.1 四个基本特征

进程由操做系统建立、管理的,离开了操做系统也就不谈什么进程了,先看看操做系统的四个基本特征:异步

  • 并发(concurrence)

并行性是指两个或者多个事件在同一时刻发生,这是一个具备微观意义的概念,即在物理上这些事件是同时发生的;而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。async

在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。应当指出,一般的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每一个程序创建进程。进程,又称任务,简单来讲,是指在系统中能独立运行并做为资源分配的基本单位,它是一个活动的实体。多个进程之间能够并发执行和交换信息。一个进程在运行时须要运行时须要必定的资源,如 cpu,存储空间,及i/o设备等。在操做系统中引入进程的目的是使程序能并发执行。性能

  • 共享 (sharing)

所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。因为资源的属性不一样,故多个进程对资源的共享方式也不一样,能够分为:互斥共享方式 和 同时访问方式spa

  • 虚拟 (virtual)

是指经过技术吧一个物理实体变成若干个逻辑上的对应物。在操做系统中虚拟的实现主要是经过分时的使用方法。显然,若是n是某一个物理设备所对应的虚拟逻辑设备数,则虚拟设备的速度必然是物理设备速度的1/n。操作系统

  • 异步 (asynchronism)

在多道程序设计环境下,容许多个进程并发执行,因为资源等因素的限制,一般,进程的执行并不是“一鼓作气”,而是以“走走停停”的方式运行。内存中每一个进程在什么时候执行,什么时候暂停,以怎样的方式向前推动,每道程序总共须要多少时间才能完成,都是不可预知的。或者说,进程是以异步的方式运行的。尽管如此,但只要运行环境相同,做业通过屡次运行,都会得到彻底相同的结果,所以,异步运行方式是容许的。.net

1.2 进程的出现

操做系统为了使程序并发执行而产生了进程。

1.3 进程的定义和特征

进程的定义:可并发执行的程序在一个数据集合上的运行过程。

进程的特征:

  • 动态性 进程既然是进程实体的执行过程,所以进程是有必定的生命期。而程序只是一组有序指令的集合,并放在某种介质上,自己无运行的含义,所以程序是个静态的实体。
  • 并发性
  • 独立性  这是指进程实体是一个能独立运行的基本单位,同时也是系统种独立得到资源和调度的基本单位。
  • 异步性
  • 结构特征 从结构上看,进程实体是由程序段、数据段及进程控制块三部分组成。
    (进程控制块(PCB):进程控制块是进程实体的一部分,它记录了操做系统所须要的、用于描述进程状况及控制进程运行所需的所有信息。os 是根据PCB来对并发执行的进程进行控制和管理的)

1.4 关于进程的总结 

  • 定义:可并发执行的程序在一个数据集合上的运行过程,每一个进程有一个本身的地址空间以及一个单一的控制流程。
  • 要解决的问题:为了使程序能并发执行,(要并发执行就要隔离进程,使进程独立,即每一个进程有属于本身的数据段、程序段、进程控制块)
    在.Net以前,每个应用程序被加载到单独的进程中,并为该进程指定私有的虚拟内存。进程不能直接访问物理内存,操做系统经过其它的处理把这些虚拟内存映射到物理内存或IO设备的某个区域,而这些物理内存之间不会有重叠,这就决定了一个进程不可能访问分配给另外一个进程的内存。相应地,运行在该进程中的应用程序也不可能写入另外一个应用程序的内存,这确保了任何执行出错的代码不会损害其地址空间之外的应用程序。在这种机制下,进程做为应用程序之间一个独立而安全的边界在很大程度上提升了运行安全。
  • 进程的缺点:是下降了性能。许多一块儿工做的进程须要相互通讯,而进程却不能共享任何内存,你不能经过任何有意义的方式使用从一个进程传递到另外一个进程的内存指针。此外,你不能在两个进程间进行直接调用。你必须代之以使用代理,它提供必定程度的间接性。

2 线程


 返回

2.1 线程的出现

咱们首先回顾进程的两个基本属性:

  • 进程使一个可拥有资源的独立单位
  • 进程同时又是一个能够独立调度和分派的基本单位。

正是因为这两个基本属性,才使进程成为一个能独立运行的基本单位,从而构成了进程并发执行的基础。

因为进程是一个资源的拥有者,于是在进程的建立、撤销、和切换的过程当中,系统必须为之付出较大的时空开销。为了解决这个问题,很多操做系统的学者们想到:将进程的两个属性分开,由操做系统分开处理。即对做为调度和分派的基本单位,不一样时做为独立分配资源的单位,以使之轻装运行;而对拥有资源的基本单位,又不频繁地对之进行切换,在这种思想的指导下,产生了线程的概念。

线程引入的缘由: 为了减小程序并发执行所付出的时空开销,使os具备更好的并发性。

在引入线程的os 中,线程是进程中的一个实体(进程中的一个或多个指令执行流),是被系统独立调度和分派的基本单位。线程基本上再也不拥有系统资源,(只拥有一点在运行中必不可少的资源,如程序计数器、寄存器和栈),但它可与同属一个进程的其余线程功能共享进程所拥有的所有资源。线一个线程能够建立和撤销另外一个线程;同一进程中的多个线程之间能够并发执行。

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的所有资源。一个线程能够建立和撤消另外一个线程,同一进程中的多个线程之间能够并发执行。因为线程之间的相互制约,导致线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

2 .2 关于线程的总结

  • 出现的背景:因为进程是一个资源的拥有者,于是在进程的建立、撤销、和切换的过程当中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提升。
  • 要解决的问题:解决进程的建立、撤销、和切换的过程当中,系统必须为之付出较大的时空开销的问题
  • 解决的方法:将进程的两个属性分开,由操做系统分开处理。把“独立调度、分配的基本单位”这个属性分离出来做为线程;而把进程做为资源拥有的基本单位,线程做为进程中的一个实体而存在。

3 应用程序域(AppDomain)


 返回

3.1 应用程序域的出现

在.Net中,应用程序有了一个新的边界:应用程序域(如下简称域)。它是一个用于隔离应用程序的虚拟边界。在.net出现之前,一个进程下,只能运行一个应用程序,而在,net出现后,一个进程下,能够运行多个应用程序,这都是由于应用程序域的出现。

.Net结构中,因为公共语言运行库可以验证代码是否为类型安全的代码,因此它能够提供与进程边界同样大的隔离级别,其性能开销也要低得多。

3.2 域与线程的关系

在.Net中,线程是公共语言运行库用来执行代码的操做系统构造。在运行时,全部托管代码均加载到一个域中,由特定的操做系统线程来运行。然而,域和线程之间并不具备一一对应关系。在任意给定时间,单个域中能够执行不止一个线程,并且特定线程也并不局限在单个域内。也就是说,线程能够跨越域边界,不为每一个域建立新线程。固然,在指定时刻,每一线程都只能在一个域中执行。运行库会跟踪全部域中有哪些线程正在运行。经过调用.Net类库的 Thread.GetDomain 方法,你还能够肯定正在执行的线程所在的域。

3.3 示例:在另外一个应用程序域中执行代码

若是但愿将该程序集加载到另一个应用程序域中,可使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用这些方法的其余重载版本之一,参考在另外一个应用程序域中执行代码(C# 编程指南)

若是想从默认入口点之外的位置执行另外一个程序集,可在远程程序集中定义一个从 MarshalByRefObject 派生的新类型。而后在应用程序中使用 CreateInstance 建立该类型的一个实例,参考跨越AppDomain边界访问对象

参考:

[1] 进程、线程与应用程序域(AppDomain) 浅析

[2] 复习功课:对进程、线程、应用程序域的理解

相关文章
相关标签/搜索