SCHED_FIFO线程休眠后调度规则及休眠类型相关技术确认问询
关于SCHED_FIFO线程休眠唤醒后调度队列位置的验证
首先得澄清下:sched(7)里提到的“阻塞状态”其实是广义上线程无法参与调度的状态,对应Linux内核里的可中断休眠(S)和不可中断休眠(D),手册里的表述只是为了方便理解,和内核的状态定义不冲突。
接下来逐个解答你的三个问题,都是基于Linux内核的实际行为:
1. select(2)或clock_nanosleep(2)进入的休眠是否属于可中断休眠?
你的推测完全正确,二者都属于可中断休眠(S):
- 调用
select(2)等待文件描述符就绪时,线程会进入可中断休眠,只要收到信号就会被唤醒,系统调用返回EINTR错误。 clock_nanosleep(2)不管是用相对计时还是绝对计时模式,用户态下调用的默认行为都是可中断的——收到信号会立刻唤醒线程,同样返回EINTR。只有在极少数内核内部的不可中断上下文里才会有例外,但用户态场景下不用考虑。
2. 从可中断休眠唤醒后,SCHED_FIFO线程会被放到对应优先级队列末尾吗?
是的。Linux内核对SCHED_FIFO线程的调度逻辑很明确:当原本休眠的SCHED_FIFO线程变为可运行状态时,会被插入到对应优先级调度队列的尾部。这和sched(7)里的描述完全一致。
3. 从不可中断休眠唤醒后,SCHED_FIFO线程也会被放到对应优先级队列末尾吗?
答案同样是肯定的。不可中断休眠(D)和可中断休眠(S)的区别仅在于:前者不会被信号唤醒,只能等待特定的事件(比如磁盘IO完成);但当线程被唤醒进入可运行状态后,内核的调度队列插入规则是一样的——都会把SCHED_FIFO线程放到对应优先级队列的尾部。
内容的提问来源于stack exchange,提问作者DeZee
相关产品推荐
相关产品推荐

