现在的位置: 首页 > 综合 > 正文

进程和线程及应用程序域,上下文

2014年10月25日 ⁄ 综合 ⁄ 共 2749字 ⁄ 字号 评论关闭

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

-----------------------------------------------------

线程的上下文是干什么用的?与WEB上的HttpContext有什么本质上的区别?

哎..又是翻译的误导..  
  我以前听到上下文这个字,也是一头雾水啊...  
  不要管什么上下文啦...那时误导人的翻译。  
  "上下文"的原英文是Context,翻译过来应该是"相关"  
  线程Context   的意思是线程相关的对象。  
  例如你开了一个线程来做某些事情,  
  但是在现在的编程角度,同一种线程执行的是固定的代码,  
  而具体要做什么事情呢?这就是线程Context所指定的对象所包含的信息了。  
   
  一般你要开一个线程的话,你是需要告诉线程做什么的。  
  对于初学者,一般都是使用Global变量(到了dotNet就用静态变量)  
  但这不算Context  
   
  想象一下,你做一个批量搜索网络的软件。  
  那样你可能要同时开很多线程,其中的代码可能是:  
   
  public   void   SearchUrl(string   url)  
  //search   url="http://www.microsoft.com/"  
  MyThreadClass   tc=new   MyThreadClass();  
  tc.UrlToSearch=url;  
  Thread   t=new   Thread(new   ThreadStart(tc.Go));  
  t.Start();  
   
  这样,在tc.Go里面,它本身的类tc就有UrlToSearch这个属性(this.UrlToSearch)  
  而且,在不同的线程里面,this都不同。  
  那么这个this就是线程Context  
   
  dotNet使用delegate来启动线程,使Context可以简单地就包装在delegate的相关对象上了。.  
  (如果在Java,或MFC,必须要继承Thread类,然后在那子类上定义Context成员的)  
  ..  

哦。.MyThreadClass是随手起的名字,不代表是继承Thread的。.  
  例如它的一个可能的定义是:  
   
  public   class   MyThreadClass  
  {  
          public   MyThreadClass(){}  
          public   MyThreadClass(string   url)  
          {  
                  UrlToSearch=url;  
          }  
          string   _url;  
          public   string   UrlToSearch  
          {  
                  get{return   _url;}  
                  set{_url=value;}  
          }  
  }

----------------------------------------

应用程序域——由 AppDomain 对象来表示,为执行托管代码提供隔离、卸载和安全边界。多个应用程序域可以在一个进程中运行;但是,在应用程序域和线程之间没有一对一的关联。多个线程可以属于一个应用程序域,尽管给定的线程并不局限于一个应用程序域,但在任何给定时间,线程都在一个应用程序域中执行。应用程序域通过使用 CreateDomain 方法来创建。AppDomain 实例用于加载和执行程序集 (Assembly)。当不再使用 AppDomain 时,可以将它卸载。AppDomain 类实现一组事件,这些事件使应用程序可以在加载程序集、卸载应用程序域或引发未处理的异常时进行响应。

------------------------------------------------------------------------

什么是应用程序域?
应用程序域(通常是 AppDomain)是用于隔离应用程序的虚拟进程。在同一个应用程序作用域中创建的所有对象(换句话说,从该应用程序的入口点开始沿着对象激活序列的任何地方)都在同一个应用程序域中创建。多个应用程序域可以存在于一个操作系统进程中,使它们成为隔离应用程序的简便方式。

操作系统进程通过使用各不相同的内存地址空间来提供隔离。尽管它是有效的,但也是代价昂贵的,并且不能达到大型 Web 服务器所需要的数量。与其相比,公共语言运行时通过管理在应用程序域中运行的代码的内存使用来强制进行应用程序隔离。这样就确保它不会访问应用程序域以外的内存。需要注意的是,只有类型安全的代码才能以这种方式管理(当在应用程序域中加载不安全代码时,运行时不能保证隔离)。

http://htm.winsteps.net/web/484.htm

 ------------------------------------------------------------------

http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true

http://hi.baidu.com/cc_yu_xin/blog/item/d0cab70139a6c503738da51b.html

http://msdn2.microsoft.com/zh-CN/library/6kac2kdh.aspx

 

抱歉!评论已关闭.