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;
        }
}
社区准则 博客 联系 社区 状态
主题