.Net线程开销以及上下文切换

线程开销包括以下几方面:

  • 线程内核对象(Thread kernel object):包含一组对线程进行描述的属性。该数据结构中还包括线程上下文(Thread context)。上下文是一个内存块,其中包含了CPU的寄存器集合。
  • 线程环境块(Thread environment block):用户模式中分配和初始化的一个内存块,应用程序代码能够快速访问的地址空间。
  • 用户模式栈:用户存储传给方法的局部变量和实参,此外还包含一个地址,之处当前方法返回时,线程接着应该从什么地方开始执行。默认情况下,windows为每个线程的用户模式栈分配1MB的内存。(对于本地程序而言,这只是一个虚拟地址,并没有对应真正的物理内存空间。但是对于CLR线程,CLR强制分配1MB的屋里内存空间给线程)。
  • 内核模式栈:用于存储内核模式的方法的局部变量和实参,同时也包含方法的返回地址。
  • DLL线程加载和线程分离通知:任何时候在进程中创建一个线程,都会调用该进程中加载的所有DLL的DllMain方法,并向该方法传递一个DLL_THREAD_ATTACH标志。类似的,任何时候一个线程终止,都会调用该进程中所有的DLL的DllMain方法,并向该方法传递一个DLL_THREAD_DETACH标志。(托管的DLL不会接收到这两个通知)

 

线程上下文切换:

  • 将CPU寄存器中的值保存到当前正在运行的线程的内核对象内部的一个上下文结构中
  • 从现在线程集合中选出一个线程供调度(这个线程要切换到的线程)。如果该线程由另一个进程拥有,Windows在开始执行代码或者接触任何数据之前,还必须切换CPU“看见”的虚拟地址空间
  • 将所选上下文结构中的值加载到CPU的寄存器中
posted @ 2012-07-10 23:14  HelloWorld.Michael  阅读(1045)  评论(0编辑  收藏  举报