进程、应用程序域、线程的相互关系

4.1 跨AppDomain的线程

线程存在于进程当中,它在不同的时刻可以运行于多个不同的AppDomain当中。它是进程中的基本执行单元,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时 系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。
关于线程的介绍,可参考 “C#综合揭秘——细说多线程(上)”、“C#综合揭秘——细说多线程(下)”

下面的例子将介绍一下如何跨AppDomain使用线程。

static void Main(string[] args)
{
var message = string.Format(" CurrentThreadID is:{0}\tAppDomainID is:{1}",
Thread.CurrentThread.ManagedThreadId, AppDomain.CurrentDomain.Id);
Console.WriteLine(message);
Console.Read();
}

然后再新建一个ConsoleApplication项目,在此项目中新一个AppDomain对象,在新的AppDomain中通过ExecuteAssembly方法执行Example.exe程序。
static void Main(string[] args)
{
//当前应用程序域信息
Console.WriteLine("CurrentAppDomain start!");
ShowMessage();

//建立新的应用程序域对象
AppDomain newAppDomain = AppDomain.CreateDomain("newAppDomain");
//在新的应用程序域中执行Example.exe
newAppDomain.ExecuteAssembly("Example.exe");

AppDomain.Unload(newAppDomain);
Console.ReadKey();
}

public static void ShowMessage()
{
var message = string.Format(" CurrentThreadID is:{0}\tAppDomainID is:{1}",
Thread.CurrentThread.ManagedThreadId, AppDomain.CurrentDomain.Id);
Console.WriteLine(message);
}

运行结果

可见,ID等于10的线程在不同时间内分别运行于AppDomain 1与AppDomain 2当中。

4.2 跨上下文的线程
线程既然能够跨越AppDomain的边界,当然也能跨越不同的上下文。下面这个例子中,线程将同时运行在默认上下文与提供安全线程的上下文中

class Program
{
[Synchronization]
public class ContextBound : ContextBoundObject
{
public void Test()
{
ShowMessage();
}
}

static void Main(string[] args)
{
//当前应用程序域信息
Console.WriteLine("CurrentAppDomain start!");
ShowMessage();

//在上下文绑定对象中运行线程
ContextBound contextBound = new ContextBound();
contextBound.Test();
Console.ReadKey();
}

public static void ShowMessage()
{
var message = string.Format(" CurrentThreadID is:{0}\tContextID is:{1}",
Thread.CurrentThread.ManagedThreadId, Thread.CurrentContext.ContextID);
Console.WriteLine(message);
}
}

运行结果

进程(Process)、线程(Thread)、应用程序域(AppDomain)、上下文(Context)的关系如下图,一个进程内可以包括多个应用程序域,也有包括多个线程,线程也可以穿梭于多个应用程序域当中。但在同一个时刻,线程只会处于一个应用程序域内。线程也能穿梭于多个上下文当中,进行对象的调用。
虽然进程、应用程序域与上下文在平常的开发中并非经常用到,但深入地了解三者的关系,熟悉其操作方式对合理利用系统的资源,提高系统的效率是非常有意义的。尤其是三者与线程之间的关系尤为重要,特别是在一个多线程系统中,如果不能理清其关系而盲目使用多线程,容易造成资源抢占与死锁之类的错误。

原文地址:https://www.cnblogs.com/chuizilong/p/10179692.html

时间: 2024-10-05 04:43:54

进程、应用程序域、线程的相互关系的相关文章

进程与线程之间的关系和区别 及 CPU调度

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程. (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源. (3)处理机分给线程,即真正在处理机上运行的是线程. (4)线程在执行过程中,需要协作同步.不同进程的线程间要利用消息通信的办法实现同步.

进程与线程之间的关系

看到一种说法是"一个程序至少有一个进程,一个进程至少有一个线程",这种把程序与进程,进程与线程的关系混淆的说法是错误的. 程序(program)只能有一个进程,一个进程就是一个程序.有人说,我打开一个程序,比如chrome,有十多个进程呢,这是咋回事.那就是十多个程序,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的CPU.对于用户而言,他们是一个整体,我们通常称之为应用程序(application).对于计算机而言,一个进程就是一个程序,多个进程(比如一个浏览

进程丶线程丶CPU关系简述

本文简单阐述了进程与线程的关系,为了便于理解,本文也将简述CPU的工作原理. 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程. (2)

26、进程和线程之间的关系

一个进程里面可以有多个线程.进程如果挂了, 线程就没了. 如果我们激活另外一个应用程序的activity,肯定另外一个应用程序 所在的进程也会被创建出来. 为什么要使用 service 是因为service这个组件会长期的在后台运行,一般情况下不会别操作系统回收. 进程的优先级 Foreground process 前台进程 优先级别最高,即便系统内存不足的时候 也不会杀死前台进程 . Visible process 可见进程 优先级稍为低一点. Service process 服务进程 存活时

Activity进程和线程之间的关系

1,四大组件并不是程序(进程)的全部,只是他的零件. 2,应用程序启动后,将创建ActivityThread主线程. 3,同一包中的组件将运行在想通的进程空间里面. 4,不同包中的组件可以通过一定的方式运行在同一个进程控件里面.(在配置文件相应组件里面设置android:process属性表明运行在那个进程里面). 5,一个Activity应用启动后至少会有3个线程:主线程+两个Binder线程.

C#:进程、线程、应用程序域(AppDomain)与上下文分析

进程     进程是操作系统用于隔离众多正在运行的应用程序的机制.在.Net之前,每一个应用程序被加载到单独的进程中,并为该进程指定私有的虚拟内存.进程不能直接访问物理内存,操作系统通过其它的处理把这些虚拟内存映射到物理内存或IO设备的某个区域,而这些物理内存之间不会有重叠,这就决定了一个进程不可能访问分配给另一个进程的内存.相应地,运行在该进程中的应用程序也不可能写入另一个应用程序的内存,这确保了任何执行出错的代码不会损害其地址空间以外的应用程序.在这种机制下,进程作为应用程序之间一个独立而安

进程与线程的定义、关系及区别

进程与线程的定义.关系及区别     --参考博客文章:http://blog.csdn.net/yanxiaolx/article/details/51763372 一.进程的定义 进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令.数据和堆栈等组成的,是一个能独立运行的活动实体. 进程一般有三个状态:就绪状态.执行状态和等待状态[或称阻塞状态]:进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系:挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进

进程、线程和上下文切换

进程是什么? 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 进程的概念主要有两点:第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion).数据区域(data region

进程与线程的区别,以及多进程与多线程

什么是线程 什么是线程?线程与进程与有什么关系?这是一个非常抽象的问题,也是一个特别广的话题,涉及到非常多的知识.我不能确保能把它讲的话,也不能确保讲的内容全部都正确.即使这样,我也希望尽可能地把他讲通俗一点,讲的明白一点,因为这是个一直困扰我很久的,扑朔迷离的知识领域,希望通过我的理解揭开它一层一层神秘的面纱. 任务调度 线程是什么?要理解这个概念,须要先了解一下操作系统的一些相关概念.大部分操作系统(如Windows.Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执