Clr Via C#读书笔记---线程基础
趣闻:我是一个线程:http://kb.cnblogs.com/page/542462/
进程与线程
进程:应用程序的一个实例使用的资源的集合。每个进程都被赋予了一个虚拟地址空间。
线程:对CPU进行虚拟化,可以理解为一个逻辑CPU.windows为每个进程提供了专用的线程(如果代码进入了无线循环,进程就会被“冻结”)
线程要素,开销
线程包括以下要素:
1. 线程内核对象, 其中包含
1)一组对线程进行描述的属性
2)线程上下文,即包含CPU寄存器的集合的一个内存块
2. 线程环境块(TEB),在用户模式中分配和初始化的一个内存块,其中包含
1)线程的异常处理链首(head)
2)线程的"线程本地存储数据"
3)由GDI和OpenGL图形使用的一些数据结构
3. 用户模式栈
1)用于存储传给方法的局部变量和实参
2)包含一个地址,指出当前方法返回时,线程接着执行的地址
4. 内核模式栈
1)用于应用程序代码想操作系统中的一个内核模式函数传递实参。Windows将实参从线程的用户模式栈复制到线程的内核模式栈
5. DLL线程连接和线程分离通知
window进程创建一个线程,调用进程中所有的加载dll的DllMain方法,并且传递一个Dll_Thread_attach标志。当线程终止的时候,就会禁止所有DLL的dllMain方法,传递一个Dll_Thread_Detach标志。有了这些通知,为进程中创建/销毁的每一个线程执行特殊初始化或(资源)清理操作。
上下文切换(所有线程(逻辑cpu)之间共享物理cpu)
上下文切换(30毫秒):线程运行的时间片(用于计算时间)也叫量程。
1. 保存CPU寄存器的值到线程内核对象的一个上下文结构中。还要考虑CPU的高速缓存(cache).
2. 调度线程。
3. 加载所选上下文结构中的值到CPU的寄存器中。
线程的优先级
1. 线程优先级从0(最低)-31(最高),系统启动时有个为0的零页线程的特殊线程,唯一一个0的线程,在没有其他进程要调度时,将系统RAM所有空闲页清零。
一个时间片后,windows检查现有所有线程内核对象,有资源的适合调度。从spy++可以查看切换的次数。线程在任何时间可以被抢占,windows调度另一个。你不能阻止其他线程的运行。 所以,windows是抢占式操作系统,不是实时操作系统,CLR使托管代码的行为更不实时。比如:DLL的JIT加载,代码的JIT编译,GC无法预测的介入。
2.系统采用有限调度优先级别高的线程,采用“饥饿”机制(抢占式操作系统,使用算法判断在什么时间调度哪些线程多少时间。)
3.系统启动会创建一个零页线程,这个特殊线程优先级别为0,系统唯一一个0的线程,负责没有线程的时候,将ram所有的空闲页清零
4.微软为了解决分配线程合理性,微软公开优先级系统抽象层。支持6个进程优先类 Idel,Below Normal,Normal,Above Normal,High,RealTime
优先级类(priority class) :Idle,Below Normal,Normal,Above Normal,High和Realtime。 优先级类是用于进程的。每个线程的优先级取决于 他所属的进程的优先级类和在该进程内他自身的优先级——俩者合成基础优先级——动态优先级是OS确保线程可响应,不一直饥饿所产生。但是16-31之间的线程,系统不提升他们的优先级。0-15的才提升。
应用开发人员永远不直接处理优先级。Normal的Normal是8,大多数程序都是8的优先级。Windwos永远不会调度进程,只调度线程。进程根据启动它的进程来分配一个优先级。大多数进程都是windows资源管理器启动的,属于Normal。
5,。优先级类与优先级区别:
线程的优先级两个标准:1,它的进程优先级类。2,在其进程优先级类中,线程的优先级类。优先级类和优先级合并构成一个线程的“基础优先级”
6.相对线程优先级:Idel,Lowest,BelowNormal,Normal,Above Normal,Highest,Time-Critical
7.托管应用程序不应该表现为拥有自己的进程;相反,他们应该表现为在一个AppDomain中运行。 可以更改他的线程相对优先级,设置Thread的Priority属性。System.Diagnostics命名空间包含一个Process类和ProcessThread类,提供进程和线程的windows视图。AppDomain和Thread类,公开了应用域和线程的CLR视图。
使用线程的理由:
可以使用线程将代码同其他代码隔离;可以使用线程来实现并发执行;可以使用线程来简化编程;
显示创建线程
非普通优先级运行,表现为前台线程,需要长时间运行, 需要提前终止。
现在一个CLR线程直接对应一个Windows线程,将来LCR可能引入它自己的逻辑线程概念,使得一个CLR逻辑线程并非一定映射到一个物理Windows线程。
一个进程中所有的前台进程停止运行时,CLR强制终止仍在运行的任何后台进程。因此,前台进程应该用于执行确实想完成的任务。
线程在CLR中要么是前台,要么是后台。一个进程中的所有前台停止时,CLR强制终止扔在运行的任何后台线程。--直接终止,不抛出异常。在线程生存期内,随时可前后变换。应用的主线程以及通过Thread对象显