windows内核进程的优先级_C++系列---低优先级的线程为什
么会⽐⾼优级的线程先执⾏...
⼀、线程的优先级
线程的优先级范围从0(最低)到31(最⾼)。当你产⽣线程时,并不是直接以数值制定某优先级,⽽是采⽤两个步骤。
第⼀个步骤是指定“优先级等级(Priority Class)”给进程,第⼆步骤是指定“相对优先级”给该进⾏的所有线程。其中的代码在
CreateProcess的dwCreationFlags参数中指定。如果你不指定,系统默认给的是NORMAL_PRIORITY_CLASS,除⾮⽗进程是
IDLE_PRIORITY_CLASS(那么⼦进程也会是IDLE_PRIORITY_CLASS)。
要改变线程的优先级,⽤如下函数:
BOOL SetThreadPriority(HANDLE hThread,int nPriority)
createprocessa
⼆、线程的优先级值
SetThreadPriority的参数:
THREAD_PRIORITY_IDLE 空闲
THREAD_PRIORITY_LOWEST 最低
THREAD_PRIORITY_BELOW_NORMAL 低于正常
THREAD_PRIORITY_NORMAL 正常
THREAD_PRIORITY_ABOVE_NORMAL ⾼于正常
THREAD_PRIORITY_HIGHEST 最⾼
THREAD_PRIORITY_TIME_CRITICAL 实时
三、运⾏实例
#include #include using namespace std;DWORD WINAPI ThreadIdle(LPVOID lpParam){int i = 0;while (i++ < 10){printf("Idle线程正在运⾏");}return 0;}DWORD WIN 四、运⾏结果
执⾏结果1
执⾏结果2
为什么两次执⾏的结果并不⼀样,低优先的线程为什么会⽐⾼优先的线程先执⾏??
五、为什么低优先级的线程会⽐⾼优先级的线程先执⾏
在我们的操作系统当中,我们操作系统内核调⽤了若⼲个线程指定序列,然后指令序列开始推进,指令序列的优先级叫做相对优先级概念。
什么叫做相对优先级?在我们实际的开发过程当中,我们可能听说过操作系统中⼀个⾮常重要的知识,
那就是尽可能多的使⽤CPU,CPU 使⽤的越多,那么就代表着CPU的计算任务越重,资源就可以得到充分的利⽤。
短作业优先,耗时短的任务越先让CPU执⾏,那么所有的作业,在任务完毕的时候,使得所有作业的平均等待时间最短。
看上去这是⼀个⾮常优化的算法,但是这样存在⼀个⾮常⼤的弊端,⽐如,作业来的很早,作业运⾏耗时很长,那么在它还没有运⾏之前来了⼀个⽐它运⾏时间段的任务进⼊CPU的就绪队列,那么CPU就会先推进那个耗时短的作业,这样就会造成公平性的丧失。
在Windows系统中,其实也考虑过这个问题,我们的优先级并不是绝对优先级,在绝⼤多数情况下⽤户态的优先级都是相对的,那么操作系统就会调度,这样就会造成Normal优先级与Idle优先并不是严格的按照⾼优先级先运⾏,低优先后运⾏。操作系统也考虑到了公平性与效率性的问题。
Idle线程优先于Normal线程调⽤,在我们的调度过程当中,我么现在的系统已经是多核的,不在像以前⼀样,只有⼀个单核,那么在多核的情况下,A核与B核这个假定,主线程可能是和某⼀个线程在A核当中,另⼀个线程分发到另⼀个空闲的核当中,那么这就会造成低优先级的线程先于⾼优先的线程调⽤。
优先级只是⼀个相对的概念,不要想当然的认为⾼优先级的线程⼀定会先于低优先级的线程调⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。