core--线程调度
2013-11-03 14:54
441 查看
线程的调度和我们用人是同一个道理,假如我们是公司的CEO,你的手下有7名大将,10名美女,100000名普通员工,现在你的任务是在1年内情切慰问完所有的员工。你将如何安排这个行程?先从那些人开始?从哪里结束?
在WINDOWS中线程是分配CPU的最小单元,线程的数量庞大。但是资源CPU却寥寥无几。系统在哪个时刻选择哪个哪个线程分配给CPU?windows又是如何实现线程切换呢?
假如有一个当前正在运行线程A,和windows已经选择好即将下一个运行的线程B。为了让线程切换,windows为每一个线程创建了一个数据结构CONTEXT。结构详细的记录了当前线程的CPU寄存器状态。当系统离开线程A,就将当前CPU所有的寄存器值都保持在CONTEXT结构中,下一次进入的时候,然后将线程B的CONTEXT结构中的值赋给CPU的各个寄存器。这样就完成了一次线程的切换。
CONTEXT结构包括以下部分:
typedefstruct_CONTEXT
{
DWORDContextFlags;
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_CONTROLorCONTEXT_INTEGERorCONTEXT_SEGMENTS,即这三个标志的组合
DWORDDr0;
DWORDDr1;
DWORDDr2;
DWORDDr3;
DWORDDr6;
DWORDDr7;
FLOATING_SAVE_AREAFloatSave;
DWORDSegGs;
DWORDSegFs;
DWORDSegEs;
DWORDSegDs;
DWORDEdi;
DWORDEsi;
DWORDEbx;
DWORDEdx;
DWORDEcx;
DWORDEax;
DWORDEbp;
DWORDEip;
DWORDSegCs;
DWORDEFlags;
DWORDEsp;
DWORDSegSs;
}CONTEXT;
获取某个线程的CONTEXT结构
SetThreadContext(HANDLEhThread,constPCONTEXTpConetext)
设置某个线程的CONTEXT结构
“除非你知道该结构的每一个字段的明确含义,尽量不要修改,否则后果很严重”
在WINDOWS中线程是分配CPU的最小单元,线程的数量庞大。但是资源CPU却寥寥无几。系统在哪个时刻选择哪个哪个线程分配给CPU?windows又是如何实现线程切换呢?
假如有一个当前正在运行线程A,和windows已经选择好即将下一个运行的线程B。为了让线程切换,windows为每一个线程创建了一个数据结构CONTEXT。结构详细的记录了当前线程的CPU寄存器状态。当系统离开线程A,就将当前CPU所有的寄存器值都保持在CONTEXT结构中,下一次进入的时候,然后将线程B的CONTEXT结构中的值赋给CPU的各个寄存器。这样就完成了一次线程的切换。
typedefstruct_CONTEXT
{
DWORDContextFlags;
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_CONTROLorCONTEXT_INTEGERorCONTEXT_SEGMENTS,即这三个标志的组合
DWORDDr0;
DWORDDr1;
DWORDDr2;
DWORDDr3;
DWORDDr6;
DWORDDr7;
FLOATING_SAVE_AREAFloatSave;
DWORDSegGs;
DWORDSegFs;
DWORDSegEs;
DWORDSegDs;
DWORDEdi;
DWORDEsi;
DWORDEbx;
DWORDEdx;
DWORDEcx;
DWORDEax;
DWORDEbp;
DWORDEip;
DWORDSegCs;
DWORDEFlags;
DWORDEsp;
DWORDSegSs;
}CONTEXT;
GetThreadContext(HANDLEhThread,PCONTEXTpConetext)
获取某个线程的CONTEXT结构
SetThreadContext(HANDLEhThread,constPCONTEXTpConetext)
设置某个线程的CONTEXT结构
“除非你知道该结构的每一个字段的明确含义,尽量不要修改,否则后果很严重”
对于线程的调度,windows为每个线程添加优先级标签来确定线程被执行的权重。他们是:
idle系统空闲时
belownormal
normal一般都是这个
abovenormal
high立即响应。任务管理器就是这个级别
real-time实时,这个会是线程抢占CPU。
“可以通过SetThreadPriority(htread,优先级别)函数来动态调节优先级别”
有时候windows为了性能和效率会动态调节线程的优先级别,我们可以调用
SetThreadPriorityBoost来禁用
相关文章推荐
- 油量问题
- HDU2265:Encoding The Diary
- 保护眼睛的颜色和各种背景颜色设置方法(转)
- 类的学习!
- Windows8.1 .NET Framework 3.5 离线安装
- Shell脚本编程的常识
- ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES)
- HDU2209:翻纸牌游戏(DFS)
- 5 神经网络(PRML)
- Windows8.1 .NET Framework 3.5 离线安装
- 来往来势凶猛
- troubleshooting root.sh problem for oracle 10g/11g
- Java Classpath!
- 做SEO,你必须拥有这些素质
- [LeetCode] Maximal Rectangle
- oracle library cache pin、library cache lock原理分析。
- java的外盒问题!
- ACM——Tutor(水题一枚)
- SHELL有用的命令
- 找出N个数中最小的k个数问题(复杂度O(N*logk))