手机版

使用简介 NET线程基�

时间:2021-11-20 来源:互联网 编辑:宝哥软件园 浏览:

线程函数和开销早期,计算机一次只能运行一个程序,长时间执行程序很容易导致计算机“瘫痪”。如果程序进入无限循环,只能重启系统。即使计算机不崩溃,也不可避免地会使用户崩溃。为了解决这个问题,操作系统设计者设计了进程的概念,让每个应用程序运行在一个虚拟的内存空间中。进程包含多个线程,CPU根据操作系统的调度执行每个进程中的线程任务。通过对CPU的虚拟管理,操作系统形成多任务执行的机制。但是像所有虚拟化机制一样,线程会产生空间和时间开销。开销包括:1。线程内核对象。数据结构包含线程上下文。在Windows x86架构CPU上,分配给每个线程内核对象的空间约为700字节,而x64架构CPU和IA64架构CPU分别约为1240字节和2500字节。2.线程环境块。它占据一个内存页面,并包含线程的异常处理链头。当线程进入try块时,会在链的开头插入一个节点,当线程退出try块时,该节点会被删除。此外,线程环境块还包括一些其他本地保存数据。3.用户模式堆栈。用户存储传递给方法的局部变量和参数;它还包含一个地址,指示线程应该从哪里开始,然后在方法返回时执行。默认情况下,每个线程的用户模式堆栈分配1MB的内存。4.内核模式堆栈。记录用户程序调用内核模式函数时的实际参数。32位系统分配12KB内存,而64位系统分配24KB内存。5.DLL线程连接和线程分离通知。每次在进程中创建和终止线程时,都会调用进程中加载的所有dll的DllMain方法。6.语境转换。对于单CPU计算机,操作系统一次只分配一个线程给CPU执行,并记录线程上下文数据,执行后保存在线程内核对象结构中。然后加载另一个线程的上下文,并将CPU执行控制权交给这个线程。如果这个线程属于另一个进程,那么在加载这个线程之前,Windows还必须让CPU处理这个虚拟地址空间。Windows操作系统一次为每个线程分配约30毫秒的执行时间,称为“时间片”。上下文切换是净开销,不会带来任何存储空间或性能的提升。但是它可以为用户提供一个健壮灵活的操作系统。空间开销测试的测试代码:复制代码如下: static void main(string[]args){ list thread list=new list thread();for(int I=0;i 1000I) {threadthread=new thread(新参数化threadstart (o={console。writeline('第{0}个线程,o);线程。睡眠(10万);}) );threadList。Add(线程);}控制台。ReadLine();for(int I=0;我是threadList。计数;i ) { threadList[i]。start(I);}控制台。ReadLine();}pslist的}观察结果:

当程序开始运行时

所有线程启动后,1000个线程启动,虚拟物理内存消耗增加31MB,而虚拟内存增加多达1000MB。线程池由于专用线程(通过实例化线程类创建的线程)的巨大内存和性能开销,CRL旨在支持线程池技术并为应用程序提供线程管理。每个CLR独立维护自己的线程池,CLR只在线程池中为应用程序建立必要的线程。在应用程序将多个任务分配给线程池之后,CLR将任务依次分配给线程池中的线程执行。当任务被执行时,线程池中的线程不会被回收,而是等待分配新的任务。这样可以有效减少线程数量,降低创建线程时的性能开销(与线程池相关的内容正在被作者整理,将陆续发布)。此外,对于Thread类,有一个实例属性IsBackground,指示线程是在前台运行还是在后台运行。前台线程是指当线程所在的进程关闭时,进程需要等待线程完成执行后才能关闭,后台进程是指当进程关闭时,线程立即停止执行,无需等待执行完成。此属性的默认值为“真”,也就是说,专用线路成蓦被视为前台线程。这里涉及进程、应用域和线程。我觉得有必要把这三个概念放在一起,做一个大概的比较。1.进程是操作系统为应用程序提供的虚拟执行地址空间,应用程序中的所有数据都在独立的进程中加载和运行。2.AppDomain是一个内部隔离的托管执行空间,由加载。NET托管应用程序。例如,IIS进程中的所有Web应用程序都在独立的AppDomain中运行。3.线程是应用程序内部的虚拟化CPU执行单元。操作系统在内存中调度所有应用程序进程中的线程,并将它们交给中央处理器执行。进程是一个虚拟地址空间,操作系统不会调度它,但会调度和执行其中包含的线程。CLR在AppDomain中也有自己运行的线程,AppDomain中的线程由CLR维护,但最终CLR还是需要将AppDomain中的线程映射到应用进程中的线程,交给操作系统进行调度。而AppDomain中的线程并不一定一一对应操作系统线程。下图概括描述了进程、AppDomain和线程之间的关系,以及操作系统对线程的调度。本文不再进一步解释细节。

根据线程优先级进行线程优先级调度。Windows将系统中的线程分为32个等级,从0到31,优先级为31的线程是优先级最高的线程,先获得执行权限。例如,如果优先级为8的线程正在执行,并且操作系统确认优先级为31的线程已准备好执行,操作系统将立即挂起正在执行的线程,并将CPU的执行权限授予优先级为31的线程。即使优先级为8的线程没有完成执行完整的时间片,优先级为31的线程也将获得完整的时间片。如果在线程执行后,操作系统发现优先级为31的线程准备执行,那么CPU执行权限将被分配给这个线程,优先级为8的前一个线程将永远不会被执行,这就是所谓的饥饿。如果开发人员没有合理设置自己程序中的线程优先级,可能会使其他应用程序难以执行,甚至影响计算机的响应速度。因此,Windows设计了一个进程优先级类来控制各种进程中线程优先级之间的关系。进程优先级是一个虚拟的概念,因为操作系统不会调度进程,这个概念只是为了控制进程中线程优先级的范围。流程优先级有六个级别(详见下表)。应用程序根据进程优先级类别,为内部线程设置相对优先级,获取操作系统调度的线程优先级值。这样可以有效控制线程优先级。线程相对优先级进程优先级类IdleBelowNormalNormalAboveNormalHighReal-Time.时间关键型1515151531最高6810121526高于或等于579111425正常468101324低于正常468101324最低4681122线程468122线程468124

版权声明:使用简介 NET线程基�是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。