4.线程到底是如何调度和切换的?

本文深入探讨了Windows内核线程调度的过程,通过分析`NtYieldExecution`函数,展示了线程如何主动让出CPU并进行调度。讲解了`KiSelectReadyThread`函数如何选择最高优先级的线程,并介绍了`KiComputeNewPriority`函数如何根据线程状态调整优先级。此外,还阐述了线程调度的原则,包括优先级严格调度、时间片分配和抢占策略等。
摘要由CSDN通过智能技术生成

4.线程到底是如何调度和切换的?

本节内容将作为本篇文章最重要的部分来讲述,源代码才是我们的王道,在WRK-v1.2\base\ntos\ke\Yield.c文件里,我们终于看到代码了,需要说明的是这个部分并非是完整的调度,我们是从这个入手来看整个的过程,没有源代码的原理就是空中楼阁。

NTSTATUS  NtYieldExecution (VOID)

{

    KIRQL OldIrql;

    PKTHREAD NewThread;

    PRKPRCB Prcb;

    NTSTATUS Status;

    PKTHREAD Thread;

 

    if (KiGetCurrentReadySummary() ==0) {      //如果当前CPU没有就绪线程

        return STATUS_NO_YIELD_PERFORMED;

 

    } else {

        Status =STATUS_NO_YIELD_PERFORMED;

        Thread =KeGetCurrentThread(); //获取当前线程

        OldIrql =KeRaiseIrqlToSynchLevel();//将运行级别提高到DISPATCH_LEVEL级别

        Prcb = KeGetCurrentPrcb();//获取重要的PRCB机构

        if (Prcb->ReadySummary !=0) {    //如果有就绪线程  

           KiAcquireThreadLock(Thread);//锁定当前线程

           KiAcquirePrcbLock(Prcb);//锁定当前PRCB

            if (Prcb->NextThread== NULL) {

                Prcb->NextThread =KiSelectReadyThread(1, Prcb);

            }    //如果没有线程准备好运行的话就向前找下一个可以运行的线程

            if ((NewThread =Prcb->NextThread) != NULL) {

                Thread->Quantum =Thread->QuantumReset;    //前面讲了很久的时限了,看到源代码的时候还是惊喜了一些

                Thread->Priority =KiComputeNewPriority(Thread, 1);    //这里很有趣哦,下面会专门讲这个函数的。   

               KiReleaseThreadLock(Thread);//释放线程锁

               KiSetContextSwapBusy(Thread);//将SwapBusy设置成TURE

 

                //将新线程设置成正在运行

                Prcb->NextThread =NULL;

               Prcb->CurrentThread = NewThread;

                NewThread->State =Running;

                Thread->WaitReason= WrY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值