基于信号的抢占式调度实现原理

Posted xxx小M

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于信号的抢占式调度实现原理相关的知识,希望对你有一定的参考价值。

当前go版本1.16.2, os: Linux

初始化initsig

// sigPreempt是一个用于非协作抢占的信号
const sigPreempt = _SIGURG
func initsig(preinit bool) {
    for i := uint32(0); i < _NSIG; i++ {
        fwdSig[i] = getsig(i)
        ,,,
        setsig(i, funcPC(sighandler)) // 注册信号对应的回调方法
    }
}

func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
    ,,,
    if sig == sigPreempt {  // 如果是抢占信号
        // Might be a preemption signal.
        doSigPreempt(gp, c)
    }
    ,,,
}

// 执行抢占
func doSigPreempt(gp *g, ctxt *sigctxt) {
    if wantAsyncPreempt(gp) {
        // isAsyncSafePoint主要检测函数是否是用户函数还是系统函数,gp是否是非g0, sp栈有空余等
        if ok, newpc := isAsyncSafePoint(gp, ctxt.sigpc(), ctxt.sigsp(), ctxt.siglr()); ok {
            // Adjust the PC and inject a call to asyncPreempt.
            ctxt.pushCall(funcPC(asyncPreempt), newpc)
        }
    }
    // Acknowledge the preemption.
    atomic.Xadd(&gp.m.preemptGen, 1)
    atomic.Store(&gp.m.signalPending, 0)
}

以上是关于基于信号的抢占式调度实现原理的主要内容,如果未能解决你的问题,请参考以下文章

深度解密Go语言之基于信号的抢占式调度

深度解密 Go 语言之基于信号的抢占式调度

erlang如何使用一个OS线程实现抢占式调度?

Linux 操作系统原理 — 进程管理 — 进程调度

FreeRTOS——任务调度—抢占式,时间片和合作式

任务调度—抢占式,时间片和合作式