• 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对象显

  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/changrulin/p/4780983.html
Copyright © 2020-2023  润新知