Windows 线程调度研究
主要目的是看看windows和实时操作系统的区别。
先列举一下几个关键函数
NtYieldExecution 此函数让当前cpu放弃时间片,操作系统会开始选择下一条线程开始调度
KiFindReadyThread 此函数涉及到以什么样的机制来选择下一条要调度的线程
KiDispatcherReadyListHead为线程全局链表(只适用于windows XP),查引用就可以找到其他跟线程调度有关的函数。
PKTHREAD
FASTCALL
KiFindReadyThread (
IN ULONG ProcessorNumber,//当前放弃时间片的NextProcessor成员
IN KPRIORITY LowPriority //太低的优先级队列不检查
){
// 位图调度算法,很多操作系统里都有
KeFindFirstSetLeftMember(PrioritySet, &HighPriority);
ListHead = &KiDispatcherReadyListHead[HighPriority];
NextEntry = ListHead->Flink;
// 遍历相同高优先级的线程列表
while (NextEntry != ListHead) {
Thread = CONTAINING_RECORD(NextEntry, KTHREAD, WaitListEntry);
NextEntry = NextEntry->Flink;
// 拿到第一条线程结构后,会根据很多的条件来判断是否调度这条
// 首先判断一下亲和性
if (Thread->Affinity & ProcessorSet) {
// 这个条件很多
if(
(Thread->IdealProcessor != Processor)&& //理想处理器不符合
(Thread->NextProcessor != Processor) && //最近使用过的处理器不符合
(WaitLimit < Thread->WaitTime) && // 线程等的又不久
(HighPriority < (LOW_REALTIME_PRIORITY + 9)) //优先级大小,小于24,不算特别高
{
// 这条线程其实就不是特别合适
// 还会再来个循环找这条链表剩下的其他的,看看合不合适,跟他娘的公司的HR一样
while (NextEntry != ListHead) {
// 找更合适的
}
}
)
}
// 满足条件
return thread;
// 不满足条件
continue;
}
}