.net 线程开销

对于每个线程中,都有以下要素:
1,线程内核对象(thread kernel object) OS为系统中创建的每个线程都分配并初始化这种数据结构之一。在该数据结构中,包含一组对线程进行描述的属性。数据结构中还包含所谓的线程上下文(thread context)。上下文是一个内存块,其中包含了CPU的寄存器集合。windows在一台使用x86 CPU的计算机上运行是,线程上下文使用约700字节的内存。对于x64和IA64 CPU,上下文分别使用约1240字节和2500字节的内存。
2,线程环境块(thread environmnet block , TEB) TEB是在用户模式(应用程序代码能快速访问的地址空间)中分配和初始化的一个内存块。TEB耗用1一个内存页(x86和x64 CPU中是4KB, IA64 CPU中是8KB)。 TEB包含线程的异常处理链首(head)。线程进入的每个try块都在链首插入一个节点。线程退出try块时,会从链中删除该节点。除此之外,TEB还包含线程的“线程本地存储”数据,以及由GDI(GraPhics Device Interface, 图形设备接口)和OpenGL图形使用的一些数据结构。
3,用户模式栈(user-mode stack)用户模式栈用于存储传给方法的局部变量和实参。它还包含一个地址;指出当前方法返回时,线程接着应该从什么地方开始执行。默认情况下,windows为每个线程的用户模式栈分配1MB内存。
4,内存模式栈(kernel-mode stack)应用程序代码向操作系统中的一个内核模式的函数传递实参时,还会使用内核模式栈。出于安全方面的原因,针对从用户模式的代码传给内核的任何实参,Windows都会把它们从线程的用户模式栈复制到线程的内核模式栈。一经复制,内核就可以验证实参的值。由于应用程序代码不能访问内核模式栈,所以应用程序无法修改验证以后的实参值。OS内核代码将开始对复制的值进行处理。除此意外,内核会调用它自己内部的方法,并利用内核模式栈传递它自己的实参】存储函数的局部变量以及存储返回地址。
5,DLL线程连接(attach)和线程分离(detach)通知 windows的一个策略是,任何时候在进程中创建一个线程,都会调用那个进程中加载的所有DLL的DllMain方法,并向该方法传递一个DLL_THREAD_ATTACH标志。类似地,任何时候一个线程终止。都会调用进程中的所有DLL的DllMain方法,并向该方法传递一个DLL_THREAD_DETACH标志。由的DLL需要利用这些通知,为进程中创建/销毁的每个线程执行一些特殊的初始化或清理操作

线程上下文切换,windows需要做哪些操作:
1,将CPU寄存器中的值保存到当前正在运行的线程内核对象内部的一个上下文结构中。
2,从现有线程集合中选出一个线程供调度(这个线程要切换到的线程)。如果该线程由另一个进程拥有,Windows在开始执行任何代码或者任何数据之前,还必须切换CPU"看见"的虚拟地址空间。
3,将所选上下文结构中的值加载到CPU的寄存器中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值