关于go抢占调度的源码解析:https://blog.csdn.net/kevin_tech/article/details/120030641
1、先需要了解进程如何处理信号
详细细节可以参考 《linux内核源码情景分析》6.4章节对于信号的描述
当我们使用kill或者其他工具向一个进程A发起一个信号的时候,进程A不会立马响应信号。只有当进程A陷入内核态,并从内核态返回的时候才会进行信号处理。
信号栈:通常而言,我们在注册一个信号函数的时候会同时绑定一个信号处理函数。而信号处理函数是要在用户态执行,结合上段话,处理信号是在内核态。因此信号函数的处理就需要先从内核态返回用户态,执行完成再进入内核态,然后继续执行之前的逻辑,再从内核态返回。也即:
- 用户态(用户代码) -> 内核态 -> 用户态(信号处理函数) -> 内核态 -> 用户态(用户代码)