zoukankan      html  css  js  c++  java
  • core--线程调度

    线程的调度和我们用人是同一个道理,假如我们是公司的CEO,你的手下有7名大将,10名美女,100000名普通员工,现在你的任务是在1年内情切慰问完所有的员工。你将如何安排这个行程?先从那些人开始?从哪里结束?

    在WINDOWS中线程是分配CPU的最小单元,线程的数量庞大。但是资源CPU却寥寥无几。系统在哪个时刻选择哪个哪个线程分配给CPU?windows又是如何实现线程切换呢?

    假如有一个当前正在运行线程A,和windows已经选择好即将下一个运行的线程B。为了让线程切换,windows为每一个线程创建了一个数据结构CONTEXT。结构详细的记录了当前线程的CPU寄存器状态。当系统离开线程A,就将当前CPU所有的寄存器值都保持在CONTEXT结构中,下一次进入的时候,然后将线程B的CONTEXT结构中的值赋给CPU的各个寄存器。这样就完成了一次线程的切换。

    CONTEXT结构包括以下部分:

    typedef struct _CONTEXT
           {
            DWORD   ContextFlags;

    CONTEXT_CONTROL:包含CPU的控制寄存器,比如指今指针,堆栈指针,标志和函数返回地址..AX, BX, CX, DX, SI, D
    CONTEXT_INTEGER:用于标识CPU的整数寄存器.DS, ES, FS, GS
    CONTEXT_FLOATING_POINT:用于标识CPU的浮点寄存器.
    CONTEXT_SEGMENTS:用于标识CPU的段寄存器.SS:SP, CS:IP, FLAGS, BP
    CONTEXT_DEBUG_REGISTER:用于标识CPU的调试寄存器.
    CONTEXT_EXTENDED_REGISTERS:用于标识CPU的扩展寄存器I
    CONTEXT_FULL:相当于CONTEXT_CONTROL or CONTEXT_INTEGER or CONTEXT_SEGMENTS,即这三个标志的组合

                           
            DWORD   Dr0;
            DWORD   Dr1;
            DWORD   Dr2;
            DWORD   Dr3;
            DWORD   Dr6;
            DWORD   Dr7;
            FLOATING_SAVE_AREA FloatSave;
            DWORD   SegGs;
            DWORD   SegFs;
            DWORD   SegEs;
            DWORD   SegDs;
            DWORD   Edi;
            DWORD   Esi;
            DWORD   Ebx;
            DWORD   Edx;
            DWORD   Ecx;
            DWORD   Eax;
            DWORD   Ebp;
            DWORD   Eip;
            DWORD   SegCs;
            DWORD   EFlags;
            DWORD   Esp;
            DWORD   SegSs;
    } CONTEXT;

     
       GetThreadContext(HANDLE hThread, PCONTEXT pConetext)

    获取某个线程的CONTEXT结构

    SetThreadContext(HANDLE hThread ,const PCONTEXT pConetext)

    设置某个线程的CONTEXT结构

    除非你知道该结构的每一个字段的明确含义,尽量不要修改,否则后果很严重

    对于线程的调度,windows为每个线程添加优先级标签来确定线程被执行的权重。他们是:

    idle 系统空闲时

    below normal

    normal    一般都是这个

    above normal

    high  立即响应。任务管理器就是这个级别

    real-time 实时,这个会是线程抢占CPU。

    可以通过SetThreadPriority(htread,优先级别)函数来动态调节优先级别

    有时候windows为了性能和效率会动态调节线程的优先级别,我们可以调用

    SetThreadPriorityBoost来禁用

  • 相关阅读:
    setContentView和inflate区别
    Android之用HTTP的get,post,HttpClient三种方式向service提交文本数据
    用C#製作PDF文件全攻略
    移动平台前端开发总结(针对iphone,Android等手机)
    Android实现左右滑动指引效果
    为 iPhone 和 iPad 自定义网站的主屏幕图标
    android 布局中的单位及分辨率自解
    纯css页面变灰度兼容ie、firefox、chrome、opera、safari
    Android判断网络连接是否可用(代码)
    Android实现渐显按钮的左右滑动效果
  • 原文地址:https://www.cnblogs.com/pavkoo/p/3404955.html
Copyright © 2011-2022 走看看