浅析Linux的就绪队列 摘要就绪态是 Linux 的一种进程的基本状态所有处于就绪态的进程只需等待CPU的分配即可立即执行。而就绪队列就是操作系统把所有处于就绪态的进程放在一起的容器是调度器选任务的数据基础。本文从进程的就绪状态切入浅析 Linux 就绪队列的 per-CPU 组织方式、任务在队列内部的存储结构以及调度器如何从中挑选下一个运行任务来为理解 Linux 进程调度提供一个清晰的切入点。关键词26SWOS就绪队列runqueue进程调度一、引言进程的五种基本状态进程主要有五种基本状态按照生命周期的顺序而言最初被系统创建时处于创建态在创建完成并分配好资源后进入就绪态等分配到CPU后被调度进程从而进入执行态而此时的执行态有三个去向一是等时间片完后又回到就绪态二是在I/O的请求下进入阻塞态直到I/O请求完成进入就绪态三是被释放进入终止态。二、就绪队列的组织方式就绪队列的组织形式从最初的所有 CPU 选任务都要抢同一把 runqueue_lock 改成了 per-CPU runqueue每个 CPU 拥有自己独立的一份就绪队列CPU 就在自己这份队列里进行分配互不干扰从根本上消除了跨核的全局锁竞争。这是 Linux 调度器能撑住几十上百核的关键前提。三、任务在队列内部的存储结构每份per-CPU 就绪队列都是用 struct rq 统一描述的它就是某个 CPU 上所有可运行任务的总入口。不过队列里的任务并不是平行的而是按调度类分层连接的优先级从上到下依次是 stop、deadline、rt、fair、idle。每类都各自挂着一个子队列deadline挂在 dl_rq上rt 挂在 rt_rq上普通进程所在的fair挂在 cfs_rq上rq-nr_running 把各子队列的就绪任务数加在一起调度器看一眼就能知道队列是不是空的。四、调度器如何选取下一个任务每次进行调度时核心函数__schedule都会调用 pick_next_task按照stop → deadline → rt → fair → idle的顺序尝试选取任务。选中的任务从就绪队列中移出成为 rq-curr 并切换上下文运行被抢占的旧任务则重新入队等下一次调度。“就绪队列”与“调度器”就这样互相配合就绪队列是存储进程的容器而调度器负责按规定的顺序取出容器里的进程。五、总结就绪队列就是进程得到CPU分配前的一种基本状态它以per-CPU runqueue的形式组织在一起并被调度器按照调度类的顺序进行调度。理解就绪队列才能更好理解 Linux 进程调度。