进程,线程,应用程序域,程序集,托管
进程
定义:可并发执行的程序在一个数据集合上的运行过程,每个进程有一个自己的地址空间以及一个单一的控制流程。
要解决的问题:为了使程序能并发执行,(要并发执行就要隔离进程,使进程独立,即每个进程有属于自己的数据段、程序段、进程控制块)
进程是一个资源拥有者,拥有自己的数据段,程序段,进程控制块,因为在创建,撤销和切换过程中,系统必须付出较大的开销,所以有了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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)